2011-02-06 94 views
5

我是很新,哈斯克爾,但如果你把一個if語句:哈斯克爾IF語句

function a b c 
    | (a+b == 0) = True 
    | --etc. 
    | otherwise = False 

是第二if語句一樣的否則,如果在其他語言,或者是它只是一個是否。我認爲它是前者,因爲你只能有一個輸出,但我只是想確定。

+0

是的,你的推理線路是正確的。有多個右邊「執行」意味着什麼?沒有任何副作用,所以我們「做」的一切,我們必須返回。我們會返回哪個價值?或者我們必須有一種方法來組合它們......我們將使用哪種方式? (只有幾個問題可以引導你對Haskell哲學) – luqui 2011-02-06 22:10:41

回答

9

您使用的構造稱爲後衛。 Haskell一個接一個地檢查給定的選擇,直到一個條件產生True。然後評估該方程的右邊。

你可以很好寫

function n 
    | n == 1 = ... 
    | n == 2 = ... 
    | n >= 3 = ... 

從而保護種如果一個代表/ ELSEIF從其他語言構造。作爲otherwise被簡單地定義爲True,最後

| otherwise = 

將永遠是真實的,因此代表一個包羅萬象的else條款。

但是,Haskell有一個通常的a = if foo then 23 else 42聲明。

+0

有道理,SO會讓我接受。謝謝! – switz 2011-02-06 21:14:55

1

它必須像一個別的如果。

底部模式otherwise實際上只是True,所以如果第一場比賽沒有勝出,您將始終獲得更具體的價值和其他價值。

2

你在這裏有什麼不是真正的if語句,而是一個警衛。但是,如果第二個案例只有在前面的案例(這裏的案例中我指的是|=之間的表達式)不匹配(評估爲True),那麼您是對的。 otherwise只是True的同義詞(這樣它總是「匹配」)。

1

正確。儘管你已經使用了警衛,但是你表達的方式與使用if語句或多或少是一致的。測試條件以產生結果的流程將通過您按照他們列在警衛中的順序編寫的警衛進行。

(a+b == 0) 

將被檢查第一

etc. 

將被檢查第二等等,沒有設置前述的條件爲真。

otherwise 

如果沒有前面的條件爲真,最後檢查。