2010-02-08 73 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的情况并非如此!。这就是需要区分两种情况的原因。这就是守卫方程式所做的。