2014-04-06 21 views
6

我試圖理解函數是什麼,但到目前爲止我不能。什麼是這兩個之間的區別:Fmap和地圖,我看不出有什麼區別

Prelude> fmap (+1) [1..9] 
[2,3,4,5,6,7,8,9,10] 

Prelude> map (+1) [1..9] 
[2,3,4,5,6,7,8,9,10] 
+9

試着用'(只有42)'代替'[1..9]',你會開悟的。 – Ingo

回答

18

對於名單,沒有什麼區別,map只是fmap專門用於名單。

fmap具有更爲一般的類型:

fmap :: Functor f => (a -> b) -> f a -> f b 

這意味着它可以與任何函子例如可以使用

fmap (+ 3) (Just 4)   -- Just 7 
fmap (+ 4) (+ 3) 1   -- 8. Functions are functors where fmap = (.) 
fmap read getLine :: IO Int -- IO is a functor 

而地圖的類型是

map :: (a -> b) -> [a] -> [b] 

如果你看一下source,對列表中的仿函數實例定義fmapmap

instance Functor [] where 
    fmap = map 
+4

通過給出一個特定的例子來說明你可以駕駛這個家,除了列表之外,你可以像'Maybe'或'IO'那樣使用'fmap'。 –

+1

@GabrielGonzalez - 感謝您的建議,我添加了一些例子。 – Lee