haskell - 的 是什么意思? Haskell 中的记录语法如何做?

标签 haskell types functional-programming ghc parsec

我正在阅读一些 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/

相关文章:

haskell - 使用 zip 部分应用 <*>

c - float - c 数据类型

python - 使用 Python Pandas 将带逗号的字符串转换为数字

python - integer 在 Python 中被提升为 long 但反之则不然。为什么?

python - 列表推导等同于并行映射两个列表

functional-programming - 对于任何使用函数式编程的项目?

javascript - 如何将嵌套对象数组转换为javascript中的对象?

haskell - 如何使用带有镜头的一元函数进行修改?

haskell - 根据具体情况填写 list

haskell - Haskell 中的 'where' 子句中的内容是否只计算一次?