haskell 了解 fmap

haskell understanding fmap

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

我希望有人能指导我如何理解这一点。

欢迎使用柯里化!!正在发生的事情是,你是 'partially applying' 内部 fmap 以获取你提供给外部 fmap 的函数。只有这个嵌套的 fmap 可以同时穿过 Rosetree[] 容器。

注意

fmap :: (a -> b) -> h a -> h b

像下面这样部分应用给出了一个函数

let g = fmap f :: h a -> hb

就是这个函数被馈送到另一个fmap

fmap g xs

因为xsRose a的列表。

也许这样更清楚:

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

当然,对于列表,map = fmap

即:

  1. f应用到x
  2. 对于 xs,将函数 fmap f 映射到列表 xs