2016-07-10 2 views
0
Prelude> :t (+2) <$> Just 2 
(+2) <$> Just 2 :: Num b => Maybe b 


Prelude> :t fmap (+2) Just 2 
fmap (+2) Just 2 :: (Num (Maybe t), Num t) => Maybe t 

Allerdings, wenn ich Klammern um das hinzufügen Vielleicht geben ich das erwartete gleiche Ergebnis:

Prelude> :t fmap (+2) (Just 2) 
fmap (+2) (Just 2) :: Num b => Maybe b 

Also meine Frage, warum - es ist Bedeutung des Vielleicht Daten Konstruktor oder etwas anderes?

+4

Sie fehlen in Ihrem zweiten Beispiel Klammern. Versuchen Sie ': t fmap (+2) (Nur 2)' – pdexter

+0

Klammern sind erforderlich, weil haskell so analysiert wird. Es hat nichts mit dem vielleicht Typ zu tun. – pdexter

+4

Beachten Sie, dass '(+2)' und 'Just' Funktionen mit den Typen 'Num a => a -> a 'und' b -> Maybe b' sind, die 'fmap' die [' Functor 'instance von' -> '] (http://stackoverflow.com/questions/10294272/confused-about-function-as-instance-of-functor-in-haskell), jetzt von der Funktorinstanz haben wir' fmap fg = \ y -> f (gy) 'in unserem Fall' f = (+2) 'und' g = Gerade ', also' fmap (+2) Gerade = \ y -> (+2) (Gerade y) 'Jetzt wendet du das auf' 2' an und du erhältst '(+2) (nur 2)'. Das erklärt die 'Num (Maybe t) 'Einschränkung. – Bakuriu

Antwort

2

Infix-Operatoren haben immer eine niedrigere Priorität als die Funktion Anwendung, daher ist (+2) <$> Just 2 dasselbe wie (+2) <$> (Just 2) und daher (<$>) (+2) (Just 2). Wenn Sie fmap als Infixoperator verwenden:

(+2) `fmap` Just 2 

Sie das gleiche Ergebnis.