Ich schreibe diese Funktion:Warum haben diese Ausdrücke unterschiedliche Mehrdeutigkeiten?
||| Returns the ten largest values in the list.
top_ten : Ord a => List a -> List a
Mein erster Versuch war eine pointfree Implementierung mit Hilfe der Funktion Zusammensetzung:
top_ten = take 10 . reverse . sort
Aber dies gab die folgenden Fehler:
Main.idr:3:9:When checking right hand side of top_ten with expected type
List a -> List a
Can't disambiguate name: Prelude.List.take, Prelude.Stream.take
Meinen zweiten Versuch war eine direkte pointierte Implementierung:
top_ten xs = take 10 (reverse (sort xs))
das funktioniert, wie auch diese:
top_ten xs = take 10 $ reverse $ sort xs
top_ten xs = take 10 (reverse $ sort xs)
top_ten xs = take 10 $ reverse . sort $ xs
top_ten xs = take 10 (reverse . sort $ xs)
diese jedoch nicht:
top_ten xs = take 10 . reverse $ sort xs
top_ten xs = take 10 . reverse . sort $ xs
top_ten xs = take 10 $ (reverse . sort) xs
top_ten xs = (take 10 . reverse) (sort xs)
top_ten xs = take 10 ((reverse . sort) xs)
Was genau ist hier los? Warum verursachen diese äquivalenten Ausdrücke unterschiedliche Ambiguitätsgrade?
Idris Typinferenz ist noch nicht so leistungsfähig wie in Haskell/Agda. –