在definition of the haskell prelude中,我们看到...
是为无法在Haskell中实现的表达式保留的。现在IO
monad例如无法在haskell中实现。
让我感到惊讶的是,seq
在前奏中定义如下
seq :: a -> b -> b
seq = ... -- Primitive
为什么不以下?我错过了什么?
seq _ b = b
答案 0 :(得分:6)
正如您在Haskell Wiki entry on seq
中所看到的,seq
函数必须满足以下两个等式:
⊥ `seq` b = ⊥
a `seq` b = b
(其中⊥
是未定义的值,这是非终止函数应用程序或hd []
和undefined
等逻辑评估的值
您的定义显然不符合第一个等式。
seq
的典型用例是在评估第二个参数之前强制评估第一个参数(弱头正常形式)。 (尽管严格来说,seq
并不保证;再次参见维基文章)
据我所知,这样的函数在没有像-XBangPatterns
这样的编译器扩展的纯Haskell中是不可定义的。