问题 Link to heading
fmap
与liftM
看起来做了相同的事,只是类型约束不同,实现上也不一样,但结果是一样,且后者的实现,可以归约到前者。那为什么使用了两种不同的命名,分别实现?同样的还存在于mapM
与traverse
等地方。
资料 Link to heading
说明 Link to heading
简单来说就是历史问题,以前的Monad等并没有受Functor约束,在2010的Haskell中已经改正了,但因为历史因素没有删除这些多余的命名。在使用中,推荐使用约束最少的那一个,比如说fmap和liftM,使用fmap。虽然实现上会有点区别,但最后的结果应该是一致的。