【问题标题】:When are guard expressions appropriate?守卫表达式什么时候合适?
【发布时间】:2011-03-30 05:50:19
【问题描述】:

这是我写的一个例子,它使用了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

【问题讨论】:

    标签: haskell idioms


    【解决方案1】:

    你举的例子很好地展示了警卫如何变得更好。

    使用守卫,您可以获得一个非常简单易读的条件和结果列表 - 非常接近数学家编写函数的方式。

    另一方面,使用if,您的嵌套表达式结构有些复杂(基本上是 O(n2) 阅读难度),其中关键字以不规则的间隔抛出。

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

    【讨论】:

    • @delnan - 也许他们在想 “O(n²) 信噪比”n 是条件数。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2017-11-27
      • 1970-01-01
      • 1970-01-01
      • 2011-09-13
      • 1970-01-01
      • 2016-04-26
      • 2012-02-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多