gpt4 book ai didi

haskell - 是否使用以 "_"(下划线)开头的模式名称来记录/鼓励/便携的忽略结果?

转载 作者:行者123 更新时间:2023-12-03 20:16:35 25 4
gpt4 key购买 nike

假设我想在 do 中 fork 一个线程-notation block ,但我不关心线程ID。如果我写

forkIO action

GHC 发出警告

Warning: A do-notation statement discarded a result of type ThreadId. Suppress this warning by saying

_ <- forkOS action


这是一个好主意,因为我想表明该程序正在丢弃一些结果。但是,通过这种方式,丢弃的内容并不明显。我可以写
threadId <- forkIO action

但是我们隐瞒了我们不会使用 threadId 的事实。任何地方,GHC 都会正确警告

Warning: Defined but not used: threadId



似乎前置下划线解决了这两个问题:
_threadId <- forkIO action

我的问题是:根据 Haskell 的语言规范,使用以下划线开头的变量是否合法?它的便携性如何?它是否记录在某处?是否鼓励这样的情况 - 记录结果被忽略?

最佳答案

是的。在 section 2.4 of the 2010 specification , 它说

Underscore, _, is treated as a lowercase letter, and can occur wherever a lowercase letter can.



...所以 _threadId是根据语言规范的合法标识符,应该是完全可移植的。

However, _ all by itself is a reserved identifier, used as wild card in patterns.



...所以你不能使用 _单独在模式之外,因此不能使用该值。

Compilers that offer warnings for unused identifiers are encouraged to suppress such warnings for identifiers beginning with underscore. This allows programmers to use _foo for a parameter that they expect to be unused.



所以 _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

是根据规范的语法错误。

关于haskell - 是否使用以 "_"(下划线)开头的模式名称来记录/鼓励/便携的忽略结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21282515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com