Nat*_*ate 11 conditional haskell if-statement guard
我刚刚开始使用Haskell,但是从我发现的所有在线教程中我似乎无法找到是否有一种可接受的方式来执行条件控制语句.我已经看过if-else,guards和pattern matching,但它们似乎都完成了同样的事情.是否有一种普遍接受/更快/更有效的方式?
Nor*_*sey 11
是否有一种普遍接受/更快/更有效的方式?
守卫是(相当复杂的)句法糖,用于if-then-else跟随模式匹配.If-then-else是语法糖case结束Bool.所以这些东西大多同样有效.
但是这里有一个观察结果:使用布尔表达式效率低下通常很容易,而模式匹配效率很高.开始Haskell程序员最喜欢的一个例子是写
length xs == 0
Run Code Online (Sandbox Code Playgroud)
花费成比例的长度xs,其中
case xs of { [] -> True; _:_ -> False }
Run Code Online (Sandbox Code Playgroud)
花费不变的时间.
一个更精确的方法来观察正在发生的事情(没有像视图模式这样的奇特扩展),模式匹配的最坏情况成本与左侧出现的构造函数的数量成正比 - 你只是无法写模式匹配既昂贵又小.相比之下,布尔表达式的大小不会告诉您评估它的成本.从这个意义上讲,仅从这个意义上讲,模式匹配比if-then-else或guards便宜.
初学者的一个好的启发式方法是尽可能使用模式匹配.随着您获得更多经验,您可以改进您的方法.