我剛剛發現了 Haskell 中的受保護方程,這里有一個例子:
abs n | n >= 0 = n
| otherwise = -n
它基本上說函式abs回傳nif n >= 0,否則回傳-n。
在書中它說標準的前奏是這樣定義的:otherwise = True,為什么會這樣?
uj5u.com熱心網友回復:
存在的原因otherwise- 以及它的定義方式 - 純粹是出于文體目的。您給出的示例可能同樣有效,如下所示:
abs n | n >= 0 = n
| True = -n
但otherwise只是讀起來更好。特別是它讀起來像一個數學定義。
uj5u.com熱心網友回復:
這是一個可愛的 hack,因此您可以撰寫類似于您參考的定義:
abs n | n >= 0 = n
| otherwise = -n
這看起來相當簡單(如果您熟悉數學符號約定),就像它說的“ abs n,如果 n 大于或等于 0,則等于n,否則等于-n”。
但簡單的保護語法始終是保護符號|,后跟條件,然后是=符號,然后是結果運算式。如果所有其他條件都失敗了,那么該語法中實際上沒有任何方式來表達適用于沒有自身條件的“else”/“otherwise”情況。
有人很早就注意到,守衛語法提供了一種獲得“否則”情況效果的方法。由于保護條件是按順序檢查的,自上而下,你可以簡單地給最后一個條件True。這將始終匹配,但是由于您上次撰寫它,因此只有在所有其他條件都失敗時才會檢查它。那會給你:
abs n | n >= 0 = n
| True = -n
但簡單的外觀True并不能立即傳達“否則”或“否則”的想法。所以有人想到了在前奏中放一個標準定義的好主意:
otherwise :: Bool
otherwise = True
現在我們可以寫:
abs n | n >= 0 = n
| otherwise = -n
而且我們在守衛中直觀地了解了“else”案例的想法,而無需更改編譯器以實作更復雜的語法!杰出的!
TBH 我不確定今天是否定義了我們會這樣做的語言。現在有點奇怪,這otherwise是一個半保留的名字。在您自己的代碼中,您可能會在滿足某些外部條件時進行系結,并且在不滿足任何條件時需要捕獲所有系結。如果您不小心呼叫它,otherwise您可能會收到有關陰影的警告,或者如果您碰巧嘗試在系結| otherwise = ...范圍內使用該成語otherwise(或者最糟糕的是,如果您otherwise實際上是 typeBool和 is False,您可能會撕裂頭發試圖找出你的原因| otherwise守衛沒有開火)。otherwise而且我們甚至還沒有真正獲得在不修改編譯器的情況下擁有這種漂亮的額外語法的能力,因為編譯器必須知道在其窮舉檢查中需要特別對待!(或者也許它沒有,它依賴于普通的行內來識別包羅萬象的True條件......我的其余觀點仍然存在)
TLDR:您可以將| otherwise其視為“無條件守衛”的特殊語法。該概念實際上是通過簡單地otherwise為 的 Prelude 定義來實作的True,但您通常應該忽略它(它并不打算讓您在任何其他背景關系中實際在布爾運算式中使用)。 otherwise
uj5u.com熱心網友回復:
它被定義為True,因為otherwise案例總是要成功的。
例如,我們可以寫:
signum n | n < 0 = -1
| n == 0 = 0
| otherwise = 1
在這種情況下,Haskell 檢查 if n < 0is True,然后,如果是,則False檢查 if n == 0is True,如果是,False則檢查 if otherwiseis True。正如您所看到的,它必須逐案處理,直到找到一個是True,這就是為什么 else 必須是 True (為了成功,當其他一切都是 時False)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/528524.html
標籤:哈斯克尔
