提问人:fredoverflow 提问时间:9/19/2011 更新时间:4/25/2019 访问量:10829
为什么我们有 map、fmap 和 liftM?
Why do we have map, fmap and liftM?
问:
map :: (a -> b) -> [a] -> [b]
fmap :: Functor f => (a -> b) -> f a -> f b
liftM :: Monad m => (a -> b) -> m a -> m b
为什么我们有三个不同的函数来做本质上相同的事情?
答:
map
存在是为了简化对列表的操作,并出于历史原因(请参阅 Haskell 中的 map 有什么意义,当有 fmap 时?
你可能会问为什么我们需要一个单独的地图功能。为什么不干脆消除电流 仅列表映射功能,并将 fmap 重命名为映射?嗯,这是个好问题。这 通常的论点是,刚刚学习 Haskell 的人,如果错误地使用 map,会很 宁愿看到关于列表的错误,而不是关于函子的错误。
-- Typeclassopedia,第 20 页
fmap
并且存在,因为单子不是 Haskell 中的自动函子:liftM
事实上,我们同时拥有 fmap 和 liftM 是一个 Monad 类型类不需要这一事实的不幸后果 一个 Functor 实例,尽管从数学上讲,每个 monad 都是一个 函。但是,fmap 和 liftM 本质上是可以互换的,因为它是 任何类型的错误(在社交意义上而不是技术意义上)都是实例 的 Monad,而不是 Functor 的实例。
-- Typeclassopedia,第 33 页
编辑:奥古斯图斯的历史和:map
fmap
事实并非如此。在Haskell 1.3中,地图的类型被推广到涵盖Functor。也就是说,在 Haskell 1.3 中,fmap 被称为 map。此更改随后在 Haskell 1.4 中恢复,并引入了 fmap。这种变化的原因是教学上的;在向初学者教授 Haskell 时,非常通用的地图类型使错误消息更难理解。在我看来,这不是解决问题的正确方法。
-- 当有 fmap 时,Haskell 中的地图有什么意义?
评论
Functor
liftM
liftM
fmap
liftM2
评论
map
liftM
fmap
fmap
liftM
map
fmap id getLine
map id getLine