Fmap和地图,我看不出差别

アレッ*_*ックス 6 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]
Run Code Online (Sandbox Code Playgroud)

Lee*_*Lee 24

对于列表,没有区别,map只是fmap专门用于列表.

fmap 有一个更通用的类型:

fmap :: Functor f => (a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)

这意味着它可以与任何仿函数一起使用,例如

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
Run Code Online (Sandbox Code Playgroud)

而地图有类型

map :: (a -> b) -> [a] -> [b]
Run Code Online (Sandbox Code Playgroud)

如果查看源代码,列表的仿函数实例定义fmapmap:

instance Functor [] where
    fmap = map
Run Code Online (Sandbox Code Playgroud)

  • 你可以通过给出一个可以使用`fmap`的列表以外的其他东西的特定示例来驱动这个家,比如`Maybe`或`IO`. (4认同)
  • @GabrielGonzalez - 感谢您的建议,我添加了一些示例。 (2认同)