'coerce' und Instanziierung von Typvariablen

8

Betrachten Sie die folgende GHCi-Sitzung:

%Vor%

Ich habe eine Ahnung von dem, was hier passiert: Der Typ-Checker muss Coercible (Ord a => a -> Map a b -> Bool) (Ord a => a -> MySet a -> Bool) erfüllen und kann b in dieser Einschränkung nicht in () instanziieren.

Gibt es einen eleganteren Weg als mit -XTypeApplications ?

Bearbeiten: Ich suche vor allem nach Lösungen, die sich mit vielen Vorkommen von MySet a im Typ beschäftigen, zum Beispiel union :: Ord a => MySet a -> MySet a -> MySet a .

    
Sebastian Graf 04.09.2017, 07:36
quelle

2 Antworten

2
%Vor%

GHC muss akzeptieren

%Vor%

Sieht das

%Vor%

was es braucht

%Vor%

was zu

führt %Vor%

Aber was ist b ? Es ist mehrdeutig. In diesem Fall spielt es keine Rolle, was b ist, weil pro Parameter member möglicherweise nicht interessiert. Es wäre also durchaus sinnvoll, b ~ () zu wählen und den Zwang trivial zu lösen. Im Allgemeinen führt GHC jedoch keine solche Parameteranalyse in der Typinferenz durch. Ich vermute, es könnte schwierig sein, das zu ändern. Vor allem, wenn die Typinferenz "rät", besteht die Gefahr, dass sie falsch rät und an anderer Stelle Rückschlüsse verhindert. Es ist eine große Dose Würmer.

Was Ihr Problem angeht, ich habe keine gute Lösung. Wenn Sie mehrere Funktionen mit ähnlichen Mustern haben, können Sie sie abstrahieren, aber Sie werden immer noch mit erheblichem Ärger konfrontiert.

    
dfeuer 05.09.2017, 07:16
quelle
1

Die Lösung mit TypeApplications ist ziemlich einfach:

%Vor%

Beachten Sie, dass einige Funktionen mehr oder weniger Platzhalter benötigen, z.

%Vor%

Um zu bestimmen, wie genau Sie die Typanwendungen angeben müssen (abgesehen von Versuch und Irrtum), verwenden Sie

%Vor%

Die Reihenfolge der Variablen, die Sie von :i erhalten, ist die gleiche, die von TypeApplications verwendet wird.

Beachten Sie, dass Sie coerce nicht für fromList verwenden können - das ist keine Einschränkung, es ergibt keinen Sinn:

%Vor%

Dies ergibt den Fehler

%Vor%

Das Beste, was Sie hier tun können, ist wahrscheinlich

%Vor%     
user2407038 05.09.2017 17:21
quelle

Tags und Links