【发布时间】:2020-03-24 09:43:02
【问题描述】:
在页面https://en.wikibooks.org/wiki/Haskell/Denotational_semantics#Pattern_Matching有以下练习:
考虑具有以下属性的两个布尔参数的函数
or:
- 或⊥ ⊥ = ⊥
- 或真⊥ =真
- 或 ⊥ 真 = 真
- 或假 y = y
- 或 x 假 = x
这个函数是联合严格性的另一个例子,但更清晰:如果两个参数都是(至少当我们将参数限制为 True 和 ⊥ 时),结果只是 ⊥。 Haskell中可以实现这样的功能吗?
函数可以用下表表示:
| ⊥ | False | True
------|-----------------------
⊥ | ⊥ | ⊥ | True
False | ⊥ | False | True
True | True | True | True
根据https://en.wikibooks.org/wiki/Haskell/Denotational_semantics#Monotonicity 中给出的定义,这个函数是单调的,所以我看不出有理由排除在Haskell 中实现这个函数的可能性。尽管如此,我没有看到实现它的方法。
练习题的答案是什么?
PS:我知道答案是“不,你不能”。我正在寻找的是一个严格的证明。我觉得我错过了一些关于可以定义哪些功能的重要限制。绝对不是所有的单调函数。
【问题讨论】:
-
你不能实现这个,除非依赖并发来并行计算两个表达式(或者一些隐藏并行性的不安全函数)。它以
por的形式存在于库中,表示“并行或”。 -
@chi 你介意分享一个证明吗?
-
@Federico 这是停机问题。给定
or x y,您必须至少评估其中的一个,以确定是返回True还是False。无论您选择x或y中的哪一个,您都有可能将其视为发散计算,即使另一个不是。并发让您可以“一次一点”评估它们中的每一个,因此如果存在非底部值,您最终会找到它。 -
我没有快速参考,但您可以尝试在 lambda 演算中搜索“por”,以及与指称语义完全抽象相关的失败。我认为某处有一些 Winskel (?) 幻灯片。
-
@chepner 我不会将此与停机问题联系起来,因为它可以通过并发来解决。我认为这可能会产生误导——如果这个问题由于 HP 而无法确定,那么再多的并发也无济于事。幸运的是,我们不必决定
x或y上的HP 来计算por x y,因为我们可以同时运行计算。在我看来,这与 lambda 演算中缺乏并发性有关。
标签: haskell lazy-evaluation strictness