我正在阅读Parsec的一些源代码。在State s u的定义中,如下所示,我注意到一些我不熟悉的语法。
data State s u = State {
stateInput :: s,
statePos :: !SourcePos,
stateUser :: !u
}
deriving ( Typeable )
在此上下文中,“!”表示什么?This page将!运算符定义为,
强制评估(严格性标志)
我最好的猜测是“!”停止了对某些变量的惰性求值。这是正确的吗?“!”可以在Haskell中的记录之外使用吗?如果它有区别,我特别想知道GHC如何处理“!"。
1条答案
按热度按时间qacovj5a1#
一般情况下,裸函数
State
是\a b c -> State a b c
的简称,如果有感叹号,每加一个seq
;因此您的声明意味着State
实际上是\a b c -> b
seqc
seqState a b c
的缩写。它也可以与非记录数据声明一起使用。除了数据声明之外,
BangPatterns
扩展还允许在模式中使用!
来添加seq
。通过举例方式,是以下内容的缩写:
注意,在这两种情况下,所有的
seq
只在应用程序饱和时出现;即,上述两个例子并不是这样的:这种差异是微妙的,但可能是重要的,有时会让你感到惊讶。