如何在Haskell中实现"对称非严格或"

Ear*_*ine 7 haskell

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

symmetricLazyOr :: Bool -> Bool -> Bool
symmetricLazyOr True _|_ === True
symmetricLazyOr _|_ True === True
Run Code Online (Sandbox Code Playgroud)

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

在Haskell中甚至可能吗?

UPDATE

这个问题主要关注语义而不是实现细节.直观地,or应该是对称的,这意味着or a b === or b a所有给定的ab.然而,这是不是真的在Haskell,因为or _|_ True === _|_同时or True _|_ === True.

Joh*_*n L 14

换句话说,你正在寻找一个函数,给定两个参数,试图评估它们两者,如果任一参数为真,则为真?特别是,True只要至少有一个参数True而不是底部,就会返回一个结果?

假设这是正确的,这是可能的,但不是纯粹的.为了实现它,您需要竞争两个线程来评估每个分支.该unamb封装具有某些功能用于处理这样的情况下(包括并行或功能por).另一个选择是lvish,在我理解的情况下也应该适用于这种情况.

  • unamb是一个实现细节,[lub](https://hackage.haskell.org/package/lub)是钱的所在.你可以用lub做很多有趣的事情,例如[非严格的记忆](http://conal.net/blog/posts/nonstrict-memoization). (5认同)