2016-04-22 5 views
1
Expected type: ErrorT String IO Integer 
Actual type: IO (Either String Integer) 

Ich habe keine Ahnung, wo ich falsch liege. Immerhin sind diese Typen isomorph.
Natürlich, wenn ich meine Unterschrift Funktion ersetzen vonWarum wird der Compiler auf isomorphe Typen wütend?

ErrorT String IO Integer 

zu

IO (Either String Integer) 

Compiler ist glücklich, aber ich bin nicht glücklich, weil ich bin verwirrt.

+4

Die complier prüft Typ Gleichheit, nicht Isomorphismus. Sonst wäre 'newtype' völlig nutzlos. Ich möchte auch nicht 'case True of Left() -> 1; Right() -> 2' zum Eintippen. – chi

+2

Compiler und seine Frau fuhren heute zur Arbeit, als ein Polizist sie herüberzog. "Weißt du, warum ich dich hingezogen habe?" Fragt der Polizist. "Kein Offizier" -Compiler antwortet. "Sie fuhren ohne Sicherheitsgurt." "Sie müssen sich irren Offizier, ich hatte es an, sehen Sie!" Sie gehen hin und her, ob der Sicherheitsgurt für ein paar Minuten an war. Dann beugt sich der Polizist und sagt zu der Frau: "War Compiler ohne Sicherheitsgurt gefahren?" Die Frau antwortet: "Officer, nach vierzig Jahren Ehe mit dem Compiler, habe ich eine Sache gelernt. Streite niemals mit ihm, wenn er betrunken ist!" Compiler bekam ein Ticket. Deshalb ist er wütend. – Spade

Antwort

4

es ist ein bisschen schwierig zu beantworten, weil es keine wirkliche Frage ist, aber der Compiler ist nicht glücklich, weil die Typen isomorph sein könnte, aber sie sind auch nicht - es gibt eine ErrorT im Weg ist:

newtype ErrorT e m a = ErrorT m (Either e a) 
         ^^^^^^ 

see here

Sie hatte dies bereits in einem anderen eine Ihrer Fragen - es war der Unterschied zwischen etwas wie

return (Left "Hello") :: IO (Either String Integer) 

und

ErrorT (return (Left "Hello")) :: ErrorT String IO Integer 
+0

Ja, ich fragte danach, aber ich verstehe es immer noch nicht. Trotzdem mache ich einen kleinen Fortschrittsschritt. Ist es möglich, von 'IO (entweder String Bool)' zu 'ErrorT String IO Bool' zu konvertieren? Es scheint mir, dass es ausreicht, (am Anfang) ErrorT –

+1

ja genau hinzuzufügen! - darum ging es bei Ihrer letzten Frage, wenn ich mich richtig erinnere - Sie müssen es nur mit'ErrorT' umhüllen – Carsten