我正在阅读一些Parsec源代码。在如下所示的State s u的定义中,我注意到了一些我不熟悉的语法。
data State s u = State {
stateInput :: s,
statePos :: !SourcePos,
stateUser :: !u
}
deriving ( Typeable )
什么是"quot;在这种情况下意味着什么?此页面定义!操作员身份,
强制评估(严格性标志(
我最好的猜测是"quot;停止对某些变量的惰性求值。这是正确的吗?可以"quot;在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` {- ... -}
差异是微妙的,但可能很重要,有时会让你大吃一惊。