如果我有多个条件只是略有不同,那么写一个函数(考虑和无法嵌套守卫)的最佳方法是:
f | a && b && c = 1
| a && b && d = 2
| a && b && e = 3
| a && g && e = 4
等
想象一下,还有更多的条件。理想情况下,我想写一个嵌套,如果那将检查然后b然后其他东西,但我被告知这在Haskell中不可能。
此外,在示例中。如果第一行返回,如果没有在where子句中定义,是否再次检查条件a和b?
答案 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
至于你的其他选择,这完全取决于具体情况。如果a
,b
等。是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 = ...
由于这些案例并非排他性,因此您需要确保订单和/或承保范围能够得到您的预期答案。