做什么!在Haskell中执行记录内语法



我正在阅读一些Parsec源代码。在如下所示的State s u的定义中,我注意到了一些我不熟悉的语法。

data State s u = State {
stateInput :: s,
statePos   :: !SourcePos,
stateUser  :: !u
}
deriving ( Typeable )

什么是"quot;在这种情况下意味着什么?此页面定义!操作员身份,

强制评估(严格性标志(

我最好的猜测是"quot;停止对某些变量的惰性求值。这是正确的吗?可以"quot;在Haskell的记录之外使用?如果这有什么不同,我特别想知道GHC是如何处理的";。

在正常情况下,裸函数Statea 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` {- ... -}

差异是微妙的,但可能很重要,有时会让你大吃一惊。

相关内容

  • 没有找到相关文章

最新更新