haskell序曲:seq

时间:2016-01-03 11:08:25

标签: haskell

definition of the haskell prelude中,我们看到...是为无法在Haskell中实现的表达式保留的。现在IO monad例如无法在haskell中实现。

让我感到惊讶的是,seq在前奏中定义如下

seq :: a -> b -> b
seq = ...       -- Primitive

为什么不以下?我错过了什么?

seq _ b = b

1 个答案:

答案 0 :(得分:6)

正如您在Haskell Wiki entry on seq中所看到的,seq函数必须满足以下两个等式:

⊥ `seq` b = ⊥
a `seq` b = b

(其中是未定义的值,这是非终止函数应用程序或hd []undefined等逻辑评估的值

您的定义显然不符合第一个等式。

seq的典型用例是在评估第二个参数之前强制评估第一个参数(弱头正常形式)。 (尽管严格来说,seq并不保证;再次参见维基文章)

据我所知,这样的函数在没有像-XBangPatterns这样的编译器扩展的纯Haskell中是不可定义的。