Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 正在使用以“开始”开头的模式名称_&引用;(下划线)对于记录/鼓励/可移植的忽略结果?_Haskell_Syntax_Pattern Matching_Wildcard_Portability - Fatal编程技术网

Haskell 正在使用以“开始”开头的模式名称_&引用;(下划线)对于记录/鼓励/可移植的忽略结果?

Haskell 正在使用以“开始”开头的模式名称_&引用;(下划线)对于记录/鼓励/可移植的忽略结果?,haskell,syntax,pattern-matching,wildcard,portability,Haskell,Syntax,Pattern Matching,Wildcard,Portability,假设我想在do-符号块中分叉一个线程,但我不关心线程id forkIO action GHC发出警告 警告:do-notation语句丢弃了类型为ThreadId的结果。通过以下方式抑制此警告: _ <- forkOS action 我的问题是:根据Haskell的语言规范,使用以下划线开头的变量是否合法?它有多便携?它在什么地方有记录吗?对于这种情况,是否鼓励记录结果被忽略?是。它说,在中国 下划线“”被视为小写字母,可以出现在小写字母可以出现的任何地方 …因此,\u threadI

假设我想在
do
-符号块中分叉一个线程,但我不关心线程id

forkIO action
GHC发出警告

警告:
do
-notation语句丢弃了类型为
ThreadId
的结果。通过以下方式抑制此警告:

_ <- forkOS action
我的问题是:根据Haskell的语言规范,使用以下划线开头的变量是否合法?它有多便携?它在什么地方有记录吗?对于这种情况,是否鼓励记录结果被忽略?

是。它说,在中国

下划线“
”被视为小写字母,可以出现在小写字母可以出现的任何地方

…因此,
\u threadId
是符合语言规范的合法标识符,应该是完全可移植的

但是,
\uuu
本身是一个保留标识符,在模式中用作通配符

…因此您不能在模式之外单独使用
,因此不能使用该值

鼓励为未使用的标识符提供警告的编译器禁止对以下划线开头的标识符发出此类警告。这允许程序员使用
\u foo
作为他们希望不用的参数

因此,
\u threadId
是一个普通的标识符,您可以在其他地方使用它,但如果您将其扔掉,就不应该收到警告

(Haskell 98报告中的内容与此完全相同。)


示例:

main = do
     _two <- return 2
     print _two       -- works
main=do

_二是合法的,便于携带。我鼓励这样做在我看来,拥有多个通配符标识符是一个好主意,但如果它们不打算警告“已定义但未使用”,就不应该允许使用它们@允许使用像
\u thisOne
这样的标签标识符。它们也可以被忽略。@chunksOf50:呃,是的,我忘了一个“不”。基本上,我认为不应该有任何形式的变量不警告缺乏使用。(但我相信各种异端的事情,比如不完整的模式匹配是不应该被允许的)。啊-你在你的应该中加了“不”。我明白你的意思。我不禁想到在生成镜头时使用下划线记录字段名的方法。是
@GarethR中的
\uuu
是的,
\u
是一种模式,当您尝试将其用作标识符时,语法错误在下一行。我已经更新了我的答案,让它更清楚,所以谢谢你的问题。
_threadId <- forkIO action
main = do
     _two <- return 2
     print _two       -- works
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