在哪种感觉守卫比命令更好 – 如果? (haskell新手)

栏目: 编程语言 · 发布时间: 5年前

内容简介:翻译自: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


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

创新者的处方

创新者的处方

[美]克莱顿·克里斯坦森、杰罗姆·格罗斯曼、黄捷升 / 朱恒鹏、张琦 / 中国人民大学出版社 / 2015-9 / 89.90元

[内容简介] ● 创新大师克里斯坦森采用了哈佛商学院在20年研究中总结而出的、在各行业实践中获得成功的管理创新经验,把颠覆式创新理念引入美国医疗行业研究。医疗机构需要量体裁衣,选择合适的商业模式展开创新之举。 ● 作者同时探讨了医疗保险公司、制药企业、医学院和政府机构在医疗改革中起到的作用,从社会性角度深入剖析了医疗保健行业未来之路。 ● 医疗界人士、政策制定者、对医疗界现......一起来看看 《创新者的处方》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

MD5 加密
MD5 加密

MD5 加密工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具