在Haskell中,!在记录语法中有什么作用?

nx7onnlm  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(146)

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

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

在此上下文中,“!”表示什么?This page将!运算符定义为,
强制评估(严格性标志)
我最好的猜测是“!”停止了对某些变量的惰性求值。这是正确的吗?“!”可以在Haskell中的记录之外使用吗?如果它有区别,我特别想知道GHC如何处理“!"。

qacovj5a

qacovj5a1#

一般情况下,裸函数State\a b c -> State a b c的简称,如果有感叹号,每加一个seq;因此您的声明意味着State实际上是\a b c -> bseqcseqState 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` {- ... -}

这种差异是微妙的,但可能是重要的,有时会让你感到惊讶。

相关问题