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
因为xs
是Rose a
的列表。
也许这样更清楚:
fmap f (x :> xs) = (f x) :> map (fmap f) xs
^^^
当然,对于列表,map
= fmap
。
即:
- 将
f
应用到x
。
- 对于
xs
,将函数 fmap f
映射到列表 xs
有人可以帮助或指导我如何理解以下实现中的 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
因为xs
是Rose a
的列表。
也许这样更清楚:
fmap f (x :> xs) = (f x) :> map (fmap f) xs
^^^
当然,对于列表,map
= fmap
。
即:
- 将
f
应用到x
。 - 对于
xs
,将函数fmap f
映射到列表xs