2011-02-06 99 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 

如果没有前面的条件为真,最后检查。