2016-07-10 35 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 

但是,如果我周圍添加括號也許I型得到預期的結果相同:

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

所以我的問題是爲什麼 - 是它的數據可能構造函數或別的什麼意義?

+4

你在第二個例子中缺少括號。嘗試':t fmap(+2)(只有2)' – pdexter

+0

圓括號是必需的,因爲這就是haskell被解析的方式。它與可能的類型無關。 – pdexter

+4

請注意,發生的事情是'(+2)'和'Just'是類型爲'Num a => a - > a'和'b - > Maybe b'的函數,'fmap'使用[''函數實例的' - >'](http://stackoverflow.com/questions/10294272/confused-about-function-as-instance-of-functor-in-haskell),現在通過函子實例我們有'fmap在我們的例子中,fg = \ y-> f(gy)'f =(+2)'和'g = Just',所以'fmap(+2)Just = \ y - >(+2) '現在你把這個應用到'2',你得到了'(+2)(只是2)'。這解釋了「Num(Maybe t)」約束。 – Bakuriu

回答

2

中綴操作符總是比函數應用程序的優先級低,所以(+2) <$> Just 2(+2) <$> (Just 2)相同,因此(<$>) (+2) (Just 2)。如果您使用fmap作爲中綴運算符:

(+2) `fmap` Just 2 

您將得到相同的結果。

相關問題