【发布时间】:2016-05-01 01:54:45
【问题描述】:
如果我有多个仅略有不同的条件,那么编写以下形式的函数(考虑和无法嵌套守卫)的最佳方法是:
f | a && b && c = 1
| a && b && d = 2
| a && b && e = 3
| a && g && e = 4
等
想象一下有更多更多的条件。理想情况下,我想编写一个嵌套的 if 来检查 a then b 然后是别的东西,但有人告诉我这在 Haskell 中是不可能的。
另外,在示例中。如果第一行返回fall,如果条件a和b没有在where子句中定义,是否再次检查?
【问题讨论】:
-
谁告诉你嵌套
ifs 不可能在 Haskell 中告诉你错了。像这样的构造是完全可能的:if a then if b then A else if c then B else C else D。只是这通常被视为有点“不负责任”。您最关心的是什么,可读性、可维护性或效率? -
@AndreyChernyakhovskiy 最终提高了效率,但又不会牺牲其他两个方面的太多。我上面写的似乎不是很有效,而且,因为我正在学习,我希望我的代码尽可能“haskelly”:P
-
效率只能通过基准测试来衡量。至于“haskelliness”,遵循一些常见的模式不是教条。毕竟,这是你自己的判断。如果您认为您的程序以
ifs 的树形式布局时读取最清晰,最好这样做。 -
一种可能的“haskelly”方式是这样的:
f = let f' True True True _ _ _ = 1; f' True True _ True _ _ = 2; f' True True _ _ True _ = 3; f' True _ _ _ True True = 4; f' _ _ _ _ _ _ = 5 in f' a b c d e g -
除非
a、b、c等是计算成本很高的表达式(在这种情况下,您应该使用let绑定来确保共享),重复相同守卫可能是一个更好的解决方案:可读性比假设的轶事性能提升更有价值。
标签: haskell if-statement conditional-statements