haskell了解fmap

时间:2015-09-26 12:43:37

标签: haskell recursion tree

在下面的实现中,有人可以帮助或指明我如何理解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

我希望有人能给我一些理解这一点的方向。

2 个答案:

答案 0 :(得分:8)

这是因为xsRose a的列表。

也许这更清楚:

fmap f (x :> xs) = (f x) :> map (fmap f) xs
                            ^^^

当然,对于列表,map = fmap

那是:

  1. f应用于x
  2. {li> for 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