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