我注意到一些以 _
结尾的函数名称在 Haskell 中(例如 mapM_
, traverse_
)。
这是什么意思?
最佳答案
这只是 Prelude 中的命名约定。通常,没有下划线的函数(例如 traverse
、 sequence
、 mapM
)返回一些有意义的“聚合”值,而带有下划线的对应函数(例如 traverse_
、sequence_
、mapM_
)返回()
.通常你会使用第一组函数,但如果你不关心返回值,那么你会使用第二组函数。原因是这些函数通常是一元的;如果您使用返回 ()
的函数在单子(monad)上下文中但忽略返回值,GHC 不会发出警告(因为它总是会返回 ()
),但如果函数确实给出了您忽略的有意义的返回值,GHC 会发出警告。所以例如do { sequence [print 1,print 2,print 3]; putStrLn "ignoring prev value" }
会发出警告,但 do { sequence_ [print 1,print 2,print 3]; putStrLn "ignoring prev value" }
将不会。
关于haskell - 函数末尾的下划线在 Haskell 中是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55740973/