2010-02-08 30 views

回答

10

哈斯克爾衛兵可以被看作是一個數學函數分段定義輸入。

foo x | x < 0 = bar 
     | x < 5 = baz 
     | x < 20 = quux 
     | otherwise = quaffle 

將由數學家喜歡這樣寫:

foo(x) = { bar, if x < 0 
      baz, if x >= 0 && x < 5 
      quux, if x >= 5 && x < 20 
      quaffle, if x >= 20 

每一個Haskell功能的衛兵隱含攜帶所有它前面的警衛的否定,因爲他們之後嘗試一個其他。

Haskell選擇在等號的左邊寫保護,使其更容易遵循控制流程。如果您選擇閱讀|作爲'那樣',那麼它變得相當直觀。

+0

所以,就像執行一個函數的條件那樣......並且根據條件,它只會在條件爲真時執行那個函數,並且所有以前的條件都是錯誤的?對? – 2010-02-08 22:35:20

+0

「quaffle」...對我來說這是一個新的:D – 2010-02-09 06:00:36

+1

我讀了「|」 as「when」:'foo x,當x <0時,= bar ...當x <5,= baz'等等。不要與'when'混淆。 – Nefrubyr 2010-02-09 11:45:33

8

守護方程是一個方程(關於相等的陳述),其涉及所謂的個案區分。一個例子是:

fac :: Integer -> Integer 
fac n | n > 0  = n * fac (n - 1) 
     | otherwise = 1 

這是factorial function的定義。數學家會寫,

Latex

0!根據定義,= 1。對於所有值n大於,n!可以根據(n - 1)來定義!0的情況並非如此!。這就是需要區分兩種情況的原因。這就是守衛方程式所做的。