Ich habe mit Applicative
Instanzen gespielt, um herauszufinden, wie sie funktionieren. Allerdings verstehe ich dieses Verhalten ehrlich nicht.Wie druckt GHCi teilweise angelegte Werte aus "pure"?
Wenn ich meinen eigenen Datentyp definiere, dann wende ich pure
ohne weitere Argumente an, es wird nichts ausgedruckt, aber es kommt zu Fehlern, wenn ich versuche, etwas auf das Ergebnis anzuwenden.
ghci> data T = A
ghci> pure A
ghci> pure A 0
<interactive>:21:1:
No instance for (Show T) arising from a use of ‘print’
In a stmt of an interactive GHCi command: print it
Wenn ich jedoch T
eine Instanz Show
machen, dann wird A
in beiden Fällen ausgedruckt.
ghci> data T = A deriving (Show)
ghci> pure A
A
ghci> pure A 0
A
Was wirklich nicht verstehen ist, ich, wie pure A
Wert sein kann, die unterschiedlich zwischen den beiden Fällen gedruckt wird. Ist nicht pure A
teilweise angewendet?
Ich verstehe, warum pure A 0
Fehler im ersten Beispiel Aufruf und nicht in den zweiten, den Sinn für mich macht. Das verwendet die ((->) r)
Instanz von Applicative
, so dass es einfach eine Funktion liefert, die immer A
zurückgibt.
Aber wie ist pure
mit nur einem Wert instanziiert, wenn der Typ des applicative selbst noch nicht bekannt? Außerdem, wie kann GHC diesen Wert möglicherweise drucken?
Warum speziell 'IO'? Ist das nur ein willkürlicher Standard? –
@AlexisKing, ist es ein praktischer Standard für die Art von interaktiver Entwicklung, die Leute mit GHCi machen. In GHCi gibt es kein 'main', und es wäre ärgerlich, einen speziellen Interpreter-Befehl aufrufen zu müssen, um eine' IO'-Aktion auszuführen. – dfeuer
Mit 'IO'-Aktionen und nur' IO'-Aktionen führt * sie * sie aus und bewertet sie, so dass sie speziell behandelt werden müssen. Dass es auch generische'Applicative/Monad'-Aktionen darauf setzt, ist wahrscheinlich nur ein netter Nebeneffekt, obwohl dieser explizit im Handbuch erwähnt wird. –