雖然fmap
可以從pure
和<*>
得出,但它通常不是最有效的方法。比較:
fmap :: (a -> b) -> Maybe a -> Maybe b
fmap f Nothing = Nothing
fmap f (Just x) = Just (f x)
使用應用型工具所做的工作:
fmap :: (a -> b) -> Maybe a -> Maybe b
-- inlining pure and <*> in: fmap f x = pure f <*> x
fmap f x = case (Just f) of
Nothing -> Nothing
Just f' -> case x of
Nothing -> Nothing
Just x' -> Just (f' x')
在構造函數中無意義的東西包裹起來只是做一個模式匹配反對。
因此,顯然能夠獨立於應用功能來定義fmap
是有用的。那可能可以通過使用所有三個功能的單個類型類型來完成,使用可以覆蓋的默認實現fmap
。但是,有些類型可以製作出很好的Functor實例,但不是很好的Applicative實例,因此您可能只需要實現一個實例。因此,兩個類型類。
而且由於沒有適用實例但沒有Functor實例的類型,您應該可以像處理Functor一樣對待Applicative,如果您喜歡的話;因此兩者之間的延伸關係。
但是,如果執行函子的輪胎,你可以(在大多數情況下)要求GHC導出唯一可能實現的函子的你,與
{-# LANGUAGE DeriveFunctor #-}
data Boring a = Boring a deriving Functor
你想讓你的應用程序使用'fmap'嗎?由於你描述的微不足道的實現,它沒有理由繼承'Functor'。 – 4castle
是的,定義'fmap'是關於最簡單的事情,你可以用任何可能的類型來完成。 – leftaroundabout