我正在阅读一些 Parsec 源代码。在 State s u 的定义中,如下所示,我注意到一些我不熟悉的语法。
data State s u = State {
stateInput :: s,
statePos :: !SourcePos,
stateUser :: !u
}
deriving ( Typeable )
“!”是什么意思?在这方面意味着什么? This page定义了 !运算符为,
Force evaluation (strictness flag)
我最好的猜测是“!”停止对某些变量的惰性求值。它是否正确?能 ”!”在 Haskell 的记录之外使用?如果它有影响的话,我特别想知道 GHC 如何处理“!”。
最佳答案
正常情况下,裸函数State
是\a b c -> State a b c
的简写。如果有感叹号,则每个加一个seq
;所以你的声明意味着 State
实际上是 \a b c -> b `seq` c `seq` State a b c
的缩写。这对于记录语法来说并不特殊;它还可以与非记录数据声明一起使用。
除了数据声明之外,BangPatterns
语言扩展还允许在模式中使用 !
来添加 seq
。翻译是类似的;举例来说,
f a !b !c = {- ... -}
是缩写:
f a b c = b `seq` c `seq` {- ... -}
请注意,在这两种情况下,所有 seq
仅在应用程序饱和时出现;也就是说,上面的两个例子并不简短:
\a b -> b `seq` \c -> c `seq` State a b c
f a b = b `seq` \c -> c `seq` {- ... -}
差异很微妙,但可能很重要,有时甚至会让您感到惊讶。
关于haskell - 的 是什么意思? Haskell 中的记录语法如何做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73997715/