2013-07-28 13 views
5

Ich erwarte den folgenden Code, um "15" in eine Ganzzahl zu konvertieren und das Ergebnis zu drucken, aber es wird ein Fehler ausgegeben.

main = print $ read "15" :: Integer 

Couldn't match expected type `Integer' with actual type `IO()' 

Aber nur mit main = print (read "15" :: Integer) läuft gut. Ich hatte den Eindruck, dass $ den Rest der Zeile in Klammern effektiv umschließt. Warum funktioniert $ in diesem Fall nicht?

Antwort

12

$ ist kein Syntax Zucker, der in ( aktuellen Ort und ) in dem Ende der Leitung setzt.

So wird print $ read "15" :: Integer wie (print (read "15")) :: Integer interpretiert. Es passiert, weil $ :: (a -> b) -> a -> b (Functional Composition Infix-Operator) zwei Funktionen print und read "15" übernimmt und sie nacheinander "anwendet". :: Integer scheint hier keine Funktion zu sein, es ist eher wie ein Schlüsselwort, also funktioniert $ nicht so, wie Sie es erwartet haben.

+10

Kurz und knapp (aber nicht ganz korrekt) hat '::' eine noch niedrigere Priorität als '$'. –

+0

Es _is_ Syntax Zucker in Haskell. Ansonsten würde es nicht mit rank-N-typisierten Argumenten funktionieren. Es ist eine Funktion in PureScript. –

Verwandte Themen