Haskell中函数末尾的下划线是什么意思?

问题描述 投票:2回答:1

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

这是什么意思?

haskell
1个回答
12
投票

这只是Prelude中的命名约定。通常,没有下划线的函数(例如traversesequencemapM)返回一些有意义的“聚合”值,而带有下划线的对应物(例如traverse_sequence_mapM_)返回()。通常你会使用第一组函数,但如果你不关心返回值,那么你将使用第二组函数。原因是这些功能通常是monadic;如果你使用一个函数在monadic上下文中返回()而忽略返回值,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" }不会。

© www.soinside.com 2019 - 2024. All rights reserved.