他们是完全不同的.
这两个函数在类似列表的事情上做了非常类似的事情,但这确实是相似之处的结束.将Haskell的地图与Python的地图进行比较可能更有用,但是fmap更加通用,意义也不同.
在Haskell中,fmap是一种“提升”或“穿孔”操作.它需要一个函数来自 – > b并将其“提升”到f a – >的函数. f b.类似列表的容器是一种可以“穿孔”的东西,但是比列表更多的东西是仿函数!
对Maybe a进行映射是非常有用和常见的,尽管有人可能会认为Maybe就像一个零或一个元素的列表.但是,请考虑函数是Haskell中的函子.你可以在函数上映射并接收一个新函数,但函数显然不是迭代的.类似地,解析器组合库(如parsec)中的解析器是仿函数,您可以通过对其进行fmapping来生成新的解析器,以将函数应用于其结果.
各种各样的东西都是仿函数,其中很多都与容纳价值的容器关系不大.所有monad都是仿函数,包括Writer,State和Cont之类的东西,它们都是有效的计算,而不是类似列表的东西.其他的东西也是仿函数,比如Const,它可以与Lift结合形成一个单独收集错误的应用函子.
每个事物所做和所做的具体细节超出了这个问题的范围,但重点是Haskell的一个仿函数概念比一个“可迭代的东西”更为普遍,而且它通常以不同的方式使用Python的地图.
然而,从另一个角度来看,可以说Python的地图比Haskell的fmap更强大.普遍性需要成本,这需要简单.具体而言,您可以选择做更多的事情!这与Python与Haskell的其他差异(如动态类型和可变函数)相比,使得Python的映射可以执行Haskell的fmap无法做到的事情.
正如Daniel Sanchez指出的那样,Python的地图是可变的,所以当提供多个迭代时,它就像Haskell中的zipWith一样:
>>> map(lambda x,y: x+y, range(10), range(10))