2015-09-26 101 views
3

有人可以帮助或提供一些指导,说明如何在后续实现中理解fmap函数。haskell了解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 

我希望有人可以给我如何了解一些这方面的方向。

回答

8

这是因为xsRose a的列表。

也许这是更为清晰:

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

当然,对于名单,map = fmap

即:

  1. 适用fx
  2. xs,映射功能fmap f在列表xs
+0

谢谢你的解释!我终于忍不住了 – Danique

4

欢迎来到咖喱!!现在发生的事情是,你'部分地应用'内部fmap来获得你提供给外部fmap的函数。只有这个嵌套的fmap可以通过Rosetree[]容器。

注意

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

所以部分应用类似下面给出一个函数

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

正是这种功能,然后将其输送到其他FMAP

fmap g xs 
+0

谢谢你的答案。这真的帮助我理解! – Danique