【发布时间】:2013-02-03 20:07:07
【问题描述】:
我正在阅读有关 Haskell 指称语义 (http://en.wikibooks.org/wiki/Haskell/Denotational_semantics) 的文章,但我不明白为什么在一个类型中,与“正常”值相比,底部“值”位于另一个级别,例如为什么不能模式匹配。
我相信模式修补底部会造成麻烦,因为底部也表示非终止计算,但为什么非终止计算和错误应该被同等对待? (我假设使用不受支持的参数调用部分函数可以被视为错误)。
如果所有 Haskell 类型都包含一个模式匹配的 Java-null-like 值而不是底部,那么会丢失哪些有用的属性?
换句话说:为什么不明智地通过提升所有类型的空值来使所有 Haskell 函数合计?
(非终止计算是否需要特殊类型?)
【问题讨论】:
-
@Aivar 事实上,最近的 OO 语言(如 Kotlin 和 Ceylon)开始区分,例如 String 和 String?,后者可以为 null,但不能为前者,应该让你重新思考你的问题。我敢打赌,如果今天发明了 Java 等,null 将被禁止或以类似于 Haskell 的 Maybe 的方式限制。
-
@Ingo:实际上,我完全支持类型系统,以防程序员应该始终检查某个东西是“正常”值还是“错误值”——我满足于使用也许/要么在那里。我更多地考虑真正特殊的结果,以及模式匹配它们的可能性。现在我看到我不仅想要空值,还想要一组异常值。但是在考虑了更多之后,我必须承认我不再确定这些真正非凡的结果是否值得进行模式匹配(例如,OutOfMemory 可能不值得)。