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%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:
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:
Tags und Links haskell functional-programming arrows