2013-12-15 98 views
1

这一个是相当简单的,但我还没有找到一个令人满意的答案在其他地方。 这是关于一个严格的操作符还是非严格的操作符,在这种情况下是一个简单的OR操作符。非严格与严格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 
+0

除非我错过了一些很大的东西,'or''似乎并不像一个OR,它具有AND的行为。尽管严格和非严格OR的评估风格不同,但真值表语义(假设两个参数都是有效的布尔值)应该是相同的。 –

+0

是的,这也是我收集的,因此我说我的逻辑中有一些错误。 – dschib

回答

4

无论你是否有严格或不严格or它总是给给予相同的布尔值相同的答案,所以

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

严格性唯一的情况是,如果您有一个表达式A or B,其中B子表达式可能需要很长时间(甚至是永远!)来计算或者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,严格的第一个参数。

+0

因此,编码时,非严格使用'True _ = True'并严格总是查看两个值? – dschib

+0

基本上,是的。 – shang

+0

但是,当我已经正确理解所有内容时,非严格的'False True'也应该返回True。 – dschib

1

非严格的函数只操作数。因此,如果第一个操作数被发现是真的,那么非严格OR将不会评估第二个操作数。 (因为其结果将是真实的,无论第二个操作数是什么。)

+0

那么严格的操作符是**是否需要**两个True值才能返回true? – dschib

+0

不,这两种版本的'or'都需要两个True值。这将是一个'和'。 – shang

+0

@dschib真正的区别在于'or True undefined',对于懒惰版本是'True',并为严格版本产生错误。然而,“正常”(而非底部)值的行为应该与“析取”定义相同。 – phg