1

这个相当简单,但我在其他任何地方都没有找到令人满意的答案。这是关于严格与非严格运算符的比较,在本例中为简单的 OR。

我是否正确理解,使用严格的运算符,您总是必须查看两个布尔值中的第二个,如下所示:

strict_or False True = True strict_or True False = True 等等?

non_strict 运算符怎么样,这个运算符总是只查看第一个值,还是需要 2 个 True 值才能返回 True?

or True False = Trueor True False = False

现在看起来,我的代码中仍然存在一些逻辑错误:

or' :: (Bool,Bool) -> Bool
or' (True, True) = True
or' (True, False) = False
or' (False, _) = False


strict_or :: (Bool, Bool) -> Bool
strict_or (True,True) = True
strict_or (False, True) = True
strict_or (False, False) = False
strict_or (True, False) = True
4

2 回答 2

4

无论您是严格还是非严格or,在给定相同的布尔值的情况下,它总是给出相同的答案,所以

True  or True  -> True
False or True  -> True
True  or False -> True
False or False -> False

严格性很重要的唯一情况是,如果您有一个表达式A or B,其中B子表达式可能 a) 需要很长时间(甚至永远!)来计算或 b) 可能引发异常。

严格的or将始终运行可能很长的计算,而or如果第一个参数是非严格的,则可以“短路” True,因此根本不会评估第二个参数。这也意味着,如果第二个子表达式在评估时抛出异常,您将获得一个如下的布尔表or

True  or <exception> -> <exception>
False or <exception> -> <exception>

但对于非严格的or你会有

True  or <exception> -> True
False or <exception> -> <exception>

请注意,以上所有内容都假设or非严格在其第二个参数上是非严格的(就像在 Haskell 和大多数其他编程语言中一样),但您也可以有一个or对于其第一个参数是非严格的非严格.

于 2013-12-15T16:38:14.560 回答
1

非严格函数仅在需要时评估操作数。因此,如果发现第一个操作数为真,则非严格 OR 不会评估第二个操作数。(因为无论第二个操作数是什么,结果都会为真。)

于 2013-12-15T15:22:28.140 回答