函数末尾的下划线在Haskell中意味着什么?

时间:2019-04-18 07:19:37

标签: haskell

我注意到在Haskell中一些以_结尾的函数名(例如mapM_traverse_)。

这是什么意思?

1 个答案:

答案 0 :(得分:12)

这只是Prelude中的命名约定。通常,没有下划线的函数(例如traversesequencemapM)会返回一些有意义的“聚合”值,而带有下划线的函数(例如traverse_,{ {1}},sequence_)返回mapM_。通常,您将使用第一组函数,但是如果您不关心返回值,则可以使用第二组函数。原因是这些功能通常是单子函数。如果您在单子上下文中使用返回()的函数但忽略了返回值,则GHC不会发出警告(因为它将始终返回()),但是如果函数确实给出了有意义的结果,它将发出警告您仍然忽略的返回值GHC会警告您。所以例如()会发出警告,但do { sequence [print 1,print 2,print 3]; putStrLn "ignoring prev value" }不会。