内容简介:翻译自:https://stackoverflow.com/questions/12801649/in-which-sense-guards-are-better-than-imperative-if-new-to-haskell
在我生命中第三次尝试学习Haskell,这次是在 Learn you a Haskell… 年.
当作者解释卫兵时,他展示了这个例子:
bmiTell :: (RealFloat a) => a -> String bmiTell bmi | bmi <= 18.5 = "You're underweight, you emo, you!" | bmi <= 25.0 = "You're supposedly normal. Pffft, I bet you're ugly!" | bmi <= 30.0 = "You're fat! Lose some weight, fatty!" | otherwise = "You're a whale, congratulations!"
并说
This is very reminiscent of a big if else tree in imperative languages, only this is far better and more readable. While big if else trees are usually frowned upon, sometimes a problem is defined in such a discrete way that you can’t get around them. Guards are a very nice alternative for this.
我可以看到警卫更具可读性,但我不明白为什么语法“更好”
它更灵活吗?它更强大?守卫的最大优势是什么?
我的大问题可能是句子
While big if else trees are usually frowned upon, sometimes a problem is defined in such a discrete way that you can’t get around them
任何人都可以举一个例子吗?
Don给出了使用警卫的主要动机,但除此之外,他们也很好地结合了模式匹配.如果模式上的所有防护装置都失败,它会下降到下一个模式,因此您可以同时检查模式和条件,而不会出现大量重复的坠落情况.这是一个(非常人为的)例子:
expandRange x (Just lo, Just hi) | hi < lo = (Just x, Just x) expandRange x (Just lo, hi) | x < lo = (Just x, hi) expandRange x (lo, Just hi) | x > hi = (lo, Just x) expandRange _ range = range
如果我们认为Nothing是无界的,则需要一个元素进行比较,并将负范围“扩展”到仅该元素,移动下限/上限以包含元素,或者如果元素已包含则保持范围不变.
现在,考虑一下如何在不使用警卫的情况下编写上述内容!你最终会复制一个在概念上相同的分支多少次,因为模式不同?是的,我意识到这个小例子可以被重写以完全避免这个问题,但这并不总是可能的(或者是可取的).
在我看来,这种风格的定义是你可以使用警卫表达的最重要的事情,尽管仍然可能,如果它被写成(无人看守)模式案例的混合物,如果它仍然可能会更加冗长和难以阅读.表达式.
翻译自:https://stackoverflow.com/questions/12801649/in-which-sense-guards-are-better-than-imperative-if-new-to-haskell
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- angular 路由守卫
- Vue-router进阶:导航守卫
- Vue的路由动态重定向和导航守卫实例
- vue-router导航守卫进阶&源码实现
- 如何实现一个react-router路由拦截(导航守卫)
- 每天抵抗4000万次黑客访问,这个天猫双11,阿里巴巴如何守卫消费者权益?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。