假设我想在do-notation块中分叉一个线程,但我不关心线程id。如果我写
forkIO actionGHC发出警告
警告:
do-notation语句放弃了ThreadId类型的结果。通过以下方式压制这一警告 _ <- forkOS作用
这是一个好主意,因为我想表明,程序正在放弃一些结果。然而,这样的话,就不会明显地看到被丢弃的东西了。我可以写
threadId <- forkIO action但是,我们隐藏的事实是,我们不会在任何地方使用threadId,并且GHC正确地警告
警告:已定义但未使用:
threadId
前缀下划线似乎解决了这两个问题:
_threadId <- forkIO action我的问题是:根据Haskell的语言规范,正在使用以下划线开始的变量,合法吗?有多便携?在什么地方有记录吗?像这样的案例--记录一个结果被忽略了是被鼓励的吗?
发布于 2014-01-22 13:09:08
是。在section 2.4 of the 2010 specification中,它说
下划线
_被视为小写字母,并且可以在小写字母可以出现的地方出现。
根据语言规范,...so _threadId是一个合法的标识符,应该是完全可移植的。
然而,
_本身就是一个保留标识符,在模式中用作通配符。
...so --您不能单独使用_外部模式,因此不能使用该值。
鼓励为未使用标识符提供警告的编译器禁止以下划线开头的此类标识符警告。这允许程序员将
_foo用于他们期望未使用的参数。
因此,_threadId是一个普通的标识符,您可以在其他地方使用它,但是如果将它丢弃,则不应该发出警告。
( Haskell 98报告中的文本与此完全相同。)
示例:
main = do
_two <- return 2
print _two -- works根据规范编译和打印2
main = do
_two <- return 2
print 3 -- no warnings, but oops, didn't use _two在没有警告的情况下根据规范进行编译,以及
main = do
_ <- return 2
print _ -- syntax error: _ used as identifier是根据规范的语法错误。
https://stackoverflow.com/questions/21282515
复制相似问题