Haskell:非嚴格的布林運算

無論如何在 Haskell

中定義如下的函式?

or True      True      = True
or True      undefined = True
or True      False     = True
or undefined True      = True
or undefined False     = undefined
or undefined undefined = undefined
or False     True      = True
or False     undefined = undefined
or False     False     = False

我目前沒有它的用​​例(雖然我對它感興趣),我只是感興趣,如果可能的話.

根據您的評估順序(檢查值的順序),您可以編寫一個惰性版本:

Prelude> True || undefined
True
Prelude> undefined || True
*** Exception: Prelude.undefined

Prelude> :t or
or :: [Bool] -> Bool

Prelude> or [True, undefined]
True

實際上,Haskell中的預設定義將表現得像這樣,因為Haskell是一種惰性語言.

但是,沒有辦法“跳過”未定義的值,而不先檢視值,這會將其評估為底部,這會導致表示式未定義.

請記住,懶惰的值會出現在其中的鬼魂中:

如果你看看盒子內部,鬼可能會得到你.

如果檢查底部很重要(例如作為測試套件的一部分),您可以將它們視為異常, and intercept them .但是您不會在純函式中執行此操作.

翻譯自:https://stackoverflow.com/questions/10951353/haskell-non-strict-boolean-operations