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
所以我的問題是爲什麼 - 是它的數據可能構造函數或別的什麼意義?
你在第二個例子中缺少括號。嘗試':t fmap(+2)(只有2)' – pdexter
圓括號是必需的,因爲這就是haskell被解析的方式。它與可能的類型無關。 – pdexter
請注意,發生的事情是'(+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