2015-09-26 90 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