Operatoren mit höherer Priorität bindet stärker als Betreiber mit geringer Priorität sehen.
Um die Reihenfolge zu ermitteln, wenn sich mehrere Operatoren in einem Ausdruck befinden, beginnen Sie mit dem Operator mit der höchsten Priorität und setzen Sie Klammern um die Ausdrücke auf jeder Seite, und setzen Sie dann die Operatorrangfolge fort. Für Operatoren derselben Ebene legen Sie die Reihenfolge anhand ihrer definierten Assoziativität fest. Es ist nicht erlaubt, Operatoren der gleichen Rangstufe, aber unterschiedlicher assoziativer Verhaltensweisen zu mischen, da die Gruppierung dann mehrdeutig ist. Das Verfahren ist wohl bekannt aus der Arbeit mit numerischen Operatoren:
2 + 3 * 5 - 1 + 2
-- * is infixl 7
2 + (3 * 5) - 1 + 2
-- + and - are infixl 6, so apply parens starting at the left
(2 + (3 * 5) - 1) + 2
((2 + (3 * 5)) - 1) + 2
Da >>
hat eine höhere Priorität als $
, die gleiche Behandlung Anwendung zu
liftIO $ hClose port >> (return $ Bool True)
gibt Ihnen
liftIO $ (hClose port >> (return $ Bool True))
Zuerst werden also die hClose
und return $ Bool True
zu einem Ausdruck mit dem Typ IO (Bool')
kombiniert, der dann mit liftIO
aufgehoben wird. (Wo Bool'
ist welcher Typ Bool True
hat).
Die Haskell Report bietet eine gründliche Behandlung der Syntax, insbesondere Kapitel 2, 3 und 9.
„Das bedeutet, dass es bewerten muss 'X', bevor es' f' anwenden können.“Ähm, nein. Semantisch ist '$' eine normale Funktionsanwendung: 'f' muss ausgewertet werden, bevor wir' f' auf 'x' anwenden, aber' x' wird nur ausgewertet, wenn 'f' es erfordert. (Der einzige Unterschied zwischen '$' und normalen Funktionsanwendungen ist syntaktisch.) Vielleicht verwirren Sie '$' mit ['$!'] (Http://www.haskell.org/ghc/docs/latest/html/libraries /base/Prelude.html#v:-36--33-)? – dave4420
Versuchen Sie mit 'f = const 42' und' x = undefiniert', und Sie werden sehen, dass 'x' nicht ausgewertet werden muss. – hammar
Es wurde behoben, sollte jetzt wahr sein. – Undreren