你正在理解這個錯誤:沒有任何子類概念在任何地方玩。
當有一個類約束是這樣的:class (Functor f) => Applicative f
,這意味着用於定義某種類型是一個Applicative
情況下,它應該是已經的Functor
一個實例。
考慮數據類型Maybe
:
你這樣定義它的Functor
實例:
instance Functor Maybe where
fmap _ Nothing = Nothing
fmap f (Just a) = Just (f a)
及其Applicative
實例是這樣的:
instance Applicative Maybe where
pure = Just
(Just f) <*> (Just x) = Just (f x)
_ <*> _ = Nothing
如例子中看出上面,你無法定義名爲fmap
的新功能Applicative
實例只是b因爲它有它的階級約束。類約束只是告訴你,Applicative
實例應該已經是Functor
typeclass的一個實例。您必須在創建Functor
實例時定義fmap
函數,因爲這是Functor
類型類型需要的,但不是Applicative
之一。
此外,您的類型類應該是這樣的:
class Functor f where
fmap :: (a -> b) -> f a -> f b
class (Functor f) => Applicative f where
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b
你並不需要把fmap
附加到Applicative
類型類也。類約束意味着具有Applicative
的所有類型都需要定義fmap
。
'(<$>)'已經沒有,它是中綴版本'fmap' –