2013-12-15 99 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