Control.Arrow: Warum "lasst (a, b) = (first, second)" fehlschlägt?

8

Was ich will, ist etwas wie das zu schreiben:

let (a,b) = if *condition* then (first, second) else (second, first)

Ich habe herausgefunden, dass ich selbst das nicht schreiben kann:

let (a,b) = (first,second)

Es schlägt mit einem Fehler fehl:

%Vor%     
Capture_A_Lag 13.06.2016, 18:29
quelle

2 Antworten

2

Sehr bald versuchen Sie, einen impredikativen Typ zu konstruieren, den GHC nicht schließen kann. Sie können tun:

%Vor%

oder

%Vor%

aber Sie können nicht tun:

%Vor%

Um das Problem zu isolieren, funktioniert dies:

%Vor%

Aber wenn Sie versuchen, das an Muster zu binden:

%Vor%

es schlägt fehl. Constraints liegen außerhalb des Paartyps und sind für andere Hälften des Paares redundant, wie

%Vor%

funktioniert.

Einfaches Beispiel:

%Vor%

Man muss Constraints übernehmen, aber es gibt keine a im Typ () , d. h. Monoid a => () ist ein ambiger Typ.

Hinweis: let (a,b) = ((+), (*)) scheint zu funktionieren. Ich habe keine Ahnung warum und wie Num speziell behandelt wird:

%Vor%     
phadej 14.06.2016, 09:12
quelle
1

Es sieht so aus, als ob Sie eine Monomorphie-Einschränkung ausführen. Dies ist nur eine Einschränkung der Haskell-Typ-Inferenz und Sie können umgehen, indem Sie eine explizite Typ-Signatur hinzufügen.

%Vor%

Dieser Codetyp prüft die Typunterschrift für foo , gibt aber den Kompilierungsfehler "mehrdeutige Variable" an, wenn Sie ihn entfernen.

BTW, die Typensignatur, die ich verwendete, war diejenige, die von :t (first, second) in GHCI abgeleitet wurde. Da (first, second) und (second, first) denselben Typ haben sollen, möchten Sie wahrscheinlich einen spezifischeren Typ in Ihrer Anmerkung verwenden, wie den folgenden:

%Vor%     
hugomg 13.06.2016 18:46
quelle