Haskell中荒谬函数定义的seq有什么意义

时间:2018-05-22 04:53:28

标签: haskell

函数定义如下所示:

absurd :: Void -> a
absurd a = a `seq` spin a where
  spin (Void b) = spin b

这有什么区别?

2 个答案:

答案 0 :(得分:3)

实际构造Void类型的值是不可能的。因此,您声称属于Void类型的任何值都必须是某种错误。通过序列化该值,可以显示错误。

有关请求此功能的原始问题,请参阅:https://github.com/ekmett/void/issues/2

答案 1 :(得分:2)

该定义很旧,仅用于void包中的向后兼容性。 base中的版本更简单:

data Void

absurd :: Void -> a
absurd x = case x of

case是一个相对较新的功能。 void中的版本与较旧的GHC版本兼容,并试图通过一个奇怪的方法来获取良好的错误消息(通过强制该值)并让GHC知道评估将失败(对于死代码删除)。这不是最可靠的事情。但实际上,现在可能不值得担心太多了。