我有這樣的資料型別:
data Arf a = Ser a [Arf a] deriving Show
當實體化Functor時,這段代碼可以作業:
instance Functor Arf where
fmap f [] = []
fmap f (Ser x xs) = Ser (f x) (map (fmap f) x)
為什么在Ser的第二個引數中使用(map (fmap f) x)而不是(fmap f x)?
uj5u.com熱心網友回復:
我認為你的代碼中有一個錯字:在最后一行的最后,應該是xs而不是x。
既然如此,讓我們來討論一下地圖。
內部的fmap將函式f映射到Arf a型別。所以你可能會觀察到,在這種情況下:
fmap f :: Arf a -> Arf b
但是那些Arf a的值是在一個串列中! 那么,你如何應用一個函式,將一個單一的Arf a值轉換為這些值的整個串列?當然是用map!
所以外層的map適用于整個串列:
map (fmap f) :: [Arf a] -> [Arf b] 。
uj5u.com熱心網友回復:
(根據Fyodor的評論進行修正...)
為什么在Ser的第二個引數中使用(map (fmap f) xs)而不是(fmap f xs)?
什么是Ser的第二個引數?它是一個[Arf a],即一個Arf的串列。
你如何將f應用到xs串列中的元素?你要做的是 map ?? xs...
但是什么是???函式?
好吧,你希望它將f應用到那些Arfs里面,所以你需要它遞回地呼叫你所定義的同一個fmap函式,因此? === fmap f。
因此,map (fmap f) xs.
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/329810.html
標籤:
上一篇:Haskell檢查空串列
