2

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?

+1

Idris Typinferenz ist noch nicht so leistungsfähig wie in Haskell/Agda. –

Antwort

2

Abhängig von den Importen, die Sie in Umfang (oder Funktionen aus dem Präludium) haben Idris ist nicht in der Lage, die richtigen Funktionen zu wählen, wie András Kovács in seinem Kommentar sagte.

Sie können jedoch idris helfen:

top_ten: Ord a => List a -> List a 
top_ten = with Prelude.List take 10 . reverse . sort 
+0

Danke! Dies ist nicht ganz die Antwort auf "warum", aber ich war mir der "mit" -Syntax nicht bewusst. Können Sie einen Link zu der Dokumentation für diese Syntax veröffentlichen? Alles, was ich gefunden habe, ist eine Erwähnung auf der [homepage] (https://www.idris-lang.org/) und [dieser Google Groups Post] (https://groups.google.com/) d/msg/idris-lang/qdiMrEpabpk/DbnwAKvKe94J). –

+0

Ich kann auch nichts in der Dokumentation finden. Es ist nur etwas, dem ich begegnet bin, wahrscheinlich durch das Lesen der Mailingliste. – Markus

+0

Liegt es daran, dass die Definition von '.' so eingegeben wurde, dass abhängige Anwendungen möglich sind? Wenn Sie eine eigene Version der Komposition definieren, die keine typabhängigen Funktionen erlaubt (d. H. Nur '(b -> c) -> (a -> b) -> a -> c'), ist die Überladungsauflösung erfolgreich? – Cactus

Verwandte Themen