我有这样的数据类型:
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)
?
我认为你的代码中有一个错别字:在最后一行的末尾,它应该是xs
而不是x
。
有了这些,我们来讨论一下地图。
内部fmap
将函数f
映射到Arf a
类型上。所以你可能会注意到在这个例子中:
f :: a -> b
fmap f :: Arf a -> Arf b
但是这些Arf a
值在一个列表中!那么,如何应用将单个Arf a
值转换为整个列表这些值的函数,并转换它们中的每个值?当然是map
!
所以外部的map
适用于整个列表:
f :: a -> b
fmap f :: Arf a -> Arf b
map (fmap f) :: [Arf a] -> [Arf b]
(修复按Fyodor的评论…)
为什么
Ser
的第二个参数使用(map (fmap f) xs)
而不是(fmap f xs)
?
Ser
的第二个参数是什么?这是一个[Arf a]
,即Arf
s的列表。
如何将f
应用于xs
列表中的元素?你做map ??? xs
…
但是???
函数是什么?
好吧,你希望它将f
应用到这些Arf
的内部,所以你需要它递归地调用你定义的相同的fmap
函数,因此??? === fmap f
。
因此map (fmap f) xs
.