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