保护表达何时适当?

时间:2010-08-16 01:58:57

标签: haskell idiomatic

这是我写的一个使用if-else分支和保护表达式的例子。什么时候比另一个更合适?我想知道这一点的主要原因是因为语言通常采用惯用的方式。

test1 a b =
    if mod b 3 ≡ 0 then a + b
    else if mod b 5 ≡ 0 then a + b
    else a

test2 a b 
    | mod b 3 ≡ 0 = a + b
    | mod b 5 ≡ 0 = a + b
    | otherwise = a

2 个答案:

答案 0 :(得分:11)

您给出的示例非常好地展示了警卫如何更好。

使用警卫,你有一个非常简单易读的条件和结果列表 - 非常接近数学家如何编写函数。

另一方面,对于if,你有一个有点复杂的(基本上是O(n 2 )读取难度)嵌套表达式的结构,其中关键字以不规则的间隔抛出。 / p>

对于简单的情况,它基本上是if和守卫之间的折腾 - if在一些非常简单的情况下甚至可能更具可读性,因为它更容易在一行上书写。但是,对于更复杂的逻辑,守卫是表达相同想法的更好方式。

答案 1 :(得分:6)

我一直认为这是一个偏好问题。就个人而言,我更喜欢第二种,我认为if-elses比守卫更有必要的感觉,而且我发现卫兵更容易阅读。