【问题标题】:How to implement "symmetric non-strict or" in Haskell如何在 Haskell 中实现“对称非严格或”
【发布时间】:2014-07-04 04:54:57
【问题描述】:

我想定义一个具有以下属性的函数

symmetricLazyOr :: Bool -> Bool -> Bool
symmetricLazyOr True _|_ === True
symmetricLazyOr _|_ True === True

否则它就像正常的or一样工作。

在 Haskell 中甚至有可能吗?

更新

这个问题关注语义而不是实现细节。直观地说,or 应该是对称的,这意味着or a b === or b a 对于所有给定的ab。但是,这在 Haskell 中并非如此,因为 or _|_ True === _|_or True _|_ === True

【问题讨论】:

  • 我不知道你到底在问什么(你的“_ | _” - 底部是什么?) - 如果你在谈论底部,那么问题是:你必须从某个地方开始(通常从案例的顶部开始),然后你就会遇到麻烦 - 乍一看我认为这是不可能的,但我会考虑一下
  • 嗯......你可以破解一些东西,但在叉子或其他东西中尝试两个参数,但这对我来说感觉很丑
  • 顺便说一句:问题的更好标题可能是“对称”非严格“或)
  • 我很确定这是不可能的。你的用例是什么?
  • @JanDvorak 简单:并行计算、地毯搜索等

标签: haskell


【解决方案1】:

换句话说,您正在寻找一个函数,给定两个参数,尝试对它们都求值,并且如果其中一个参数为真,则该函数为真?特别是,只要至少一个参数是True 而不是底部,就会返回True 结果?

假设这是正确的,这是可能的,但不完全是。为了实现它,您需要竞争两个线程来评估每个分支。 unamb 包有一些处理这种情况的函数(包括并行或函数por)。另一个选项是lvish,据我了解,它在这种情况下也应该可以工作。

【讨论】:

  • unamb 是一个实现细节,lub 是钱的所在。使用 lub 可以做很多有趣的事情,例如 non-strict memoization
  • @luqui:这是真的,除了 unamb 包提供了 OP 要求的功能。如果你喜欢lub,你真的应该看看lvish,它更强大。
  • lvish 很酷,谢谢。我很难称它为“更强大”——它是一个不同的模型并以不同的方式嵌入。 AFAICT 一个不能实现另一个。
  • @luqui:我相信用lvish 实现lub 所需要做的就是将上限信息具体化为适当的格。如果您有一个不基于格的 lub 组合函数,我怀疑您也会遇到 lub 的问题(不确定性)。
  • 区别在于lub的格是不可判定的,所以这种物化是不可能的。
猜你喜欢
  • 2012-11-12
  • 2017-03-29
  • 1970-01-01
  • 2011-08-25
  • 2016-09-11
  • 2014-12-14
  • 2016-06-12
  • 1970-01-01
  • 2014-10-06
相关资源
最近更新 更多