Fmap和地图,我看不出差异

时间:2014-04-06 16:54:55

标签: haskell

我正在努力了解这些仿函数是什么,但到目前为止我还不能。这两者之间有什么区别:

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]

1 个答案:

答案 0 :(得分:24)

对于列表,没有区别,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,列表的仿函数实例会将fmap定义为map

instance Functor [] where
    fmap = map