在下面的实现中,有人可以帮助或指明我如何理解fmap函数。
data Rose a = a :> [Rose a] deriving (Eq, Show)
instance Functor Rose where
fmap f (x :> xs) = (f x) :> fmap (fmap f) xs
tree :: Rose Int
tree = 1 :> [2:>[]]
我不理解的部分(fmap f),为什么它再次进行递归,但它只需要1个参数。这怎么可能,因为它需要2。
第二部分是我不明白为什么这不起作用:
fmap f (x :> xs) = (f x) :> fmap f xs
我希望有人能给我一些理解这一点的方向。
答案 0 :(得分:8)
这是因为xs
是Rose a
的列表。
也许这更清楚:
fmap f (x :> xs) = (f x) :> map (fmap f) xs
^^^
当然,对于列表,map
= fmap
。
那是:
f
应用于x
。xs
,将功能fmap f
映射到列表xs
醇>
答案 1 :(得分:4)
欢迎currying !!发生的事情是你正在部分地应用'内部fmap获取您提供给外部fmap的函数。只有这个嵌套的fmap
才能通过Rosetree
和[]
容器。
请注意
fmap :: (a -> b) -> h a -> h b
如下所示部分应用给出了一个函数
let g = fmap f :: h a -> hb
然后将此函数提供给另一个fmap
fmap g xs