我正在努力了解这些仿函数是什么,但到目前为止我还不能。这两者之间有什么区别:
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]
答案 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