Haskell和多个条件

时间:2016-05-01 01:54:46

标签: haskell if-statement conditional-statements

如果我有多个条件只是略有不同,那么写一个函数(考虑和无法嵌套守卫)的最佳方法是:

f | a && b && c  = 1
  | a && b && d  = 2
  | a && b && e  = 3
  | a && g && e  = 4

想象一下,还有更多的条件。理想情况下,我想写一个嵌套,如果那将检查然后b然后其他东西,但我被告知这在Haskell中不可能。

此外,在示例中。如果第一行返回,如果没有在where子句中定义,是否再次检查条件a和b?

2 个答案:

答案 0 :(得分:2)

在这种情况下if语句的问题不在于它们不能嵌套,它们总是必须有else组件,这使得它们在这种情况下非常笨重,因为你必须在每个陈述中包括后备案例。 if语句中的示例看起来像这样。

f = if a then 
     if b then 
      if c then 1
       else if d then 2
        else if c
          then 3
          else 5
     else 5
    else if g then 
     if e
      then 4
      else 5
     else 5

至于你的其他选择,这完全取决于具体情况。如果ab等。是f的参数,然后你可以在函数上进行模式匹配。

f True True True False False False False = 1
f True True False True False False False = 2
f True True False False True False False = 3
f True False False False True False True = 4
f _    _    _     _     _    _     _     = 5

但是,如果变量是全局变量,或者在where子句中定义,则需要使用case语句。

f =
  case (a, b, c, d, e, f, g) of
    (True, True, True, _, _, _, _) -> 1
    (True, True, _, True, _, _, _) -> 2
    (True, True, _, _, True, _, _) -> 3
    (True, _, _, _, True, _, True) -> 4
    _                              -> 5

但实际上,只要您的变量名称不太长,您的解决方案可能是可读性和简洁性的最佳组合。至于效率,布尔运算是如此便宜,除非这个函数包含在一个非常密集的算法中的某个紧密循环中,我怀疑你将能够看到这些选项之间的速度有任何差异。

答案 1 :(得分:1)

我使用case

f x y z =
  case (a, b, c, d, e, f, g) of
    (True, True, True, _, _, _, _) -> 1
    (True, True, _, True, _, _, _) -> 2
    (True, True, _, _, True, _, _) -> 3
    (True, _, _, _, True, _, True) -> 4
  where
    a = ...
    b = ...
    c = ...

由于这些案例并非排他性,因此您需要确保订单和/或承保范围能够得到您的预期答案。