Haskell mapM和表单是否可以互换?

Haskell mapM和表单是否可以互换?,haskell,Haskell,据我所知,forM与mapM相同,只有参数是相反的。 这是否意味着我可以用mapM替换每个表单,反之亦然,如果我颠倒了我给出的参数。base中的定义如下 forM = flip mapM 根据Haskell的等式推理,这意味着您可以用flip mapM替换forM,然后用其定义替换flip,以获得外观正常的mapM用法。你也可以按照这个过程向后走,从mapM到forM表单只是 。。。所以,除了参数的顺序,它是相同的。就风格而言,forM在函数参数是一大块代码时看起来不错,您不必费心给它命名,

据我所知,
forM
mapM
相同,只有参数是相反的。 这是否意味着我可以用
mapM
替换每个
表单
,反之亦然,如果我颠倒了我给出的参数。
base
中的定义如下

forM  = flip mapM

根据Haskell的等式推理,这意味着您可以用
flip mapM
替换
forM
,然后用其定义替换
flip
,以获得外观正常的
mapM
用法。你也可以按照这个过程向后走,从
mapM
forM

<代码>表单只是

。。。所以,除了参数的顺序,它是相同的。就风格而言,
forM
在函数参数是一大块代码时看起来不错,您不必费心给它命名,如:

-- Somewhere in a do-block...
results <- forM items $ \item -> do
    -- A do-block using `item`.
--do块中的某个位置。。。
结果如何
--使用'item'的do块。
旁注:特别是如果您使用最新的GHC(以及4.8版的
base
软件包),我建议将
mapM
forM
分别替换为等效但更通用的
遍历
函数。
base-4.8
中的前奏部分导出了
遍历
,而您可以在
数据.Traversable中找到
for
。类似地,
Data.Foldable
提供了
遍历
for
,这比
mapM
表单
更为通用

-- Somewhere in a do-block...
results <- forM items $ \item -> do
    -- A do-block using `item`.