理解自定义数据类型的函子实例



我有这样的数据类型:

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],即Arfs的列表。

如何将f应用于xs列表中的元素?你做map ??? xs

但是???函数是什么?

好吧,你希望它将f应用到这些Arf的内部,所以你需要它递归地调用你定义的相同的fmap函数,因此??? === fmap f

因此map (fmap f) xs.

相关内容

  • 没有找到相关文章

最新更新