据我所知,forM
与mapM
相同,只有参数相反。
这是否意味着我可以用forM
替换每个mapM
,反之亦然,如果我颠倒我给他们的论点?
答案 0 :(得分:18)
事实上。 forM
只是literally ...
forM = flip mapM
...除了参数的顺序之外它是相同的。作为一种风格问题,forM
看起来不错,因为函数参数是一个很大的代码块,你没有给出一个名字,如:
-- Somewhere in a do-block...
results <- forM items $ \item -> do
-- A do-block using `item`.
附注:特别是如果您使用的是最新的GHC(以及base
软件包的4.8版本),我建议将mapM
和forM
替换为等效但更通用的traverse
分别为{1}}和for
个函数。 base-4.8
中的前奏导出traverse
,而您可以在for
中找到Data.Traversable
。同样,Data.Foldable
提供traverse_
和for_
,它们比mapM_
和forM_
更为通用。
答案 1 :(得分:6)
Yes。 base
中的定义为
forM = flip mapM
使用Haskell的等式推理,这意味着您可以将forM
替换为flip mapM
,然后将flip
替换为其定义,以获得正常的mapM
用法。您也可以向后关注此过程,从mapM
转到forM
。