在哪种感觉守卫比命令更好 – 如果? (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


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

查看所有标签

猜你喜欢:

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

游戏编程算法与技巧

游戏编程算法与技巧

【美】Sanjay Madhav / 刘瀚阳 / 电子工业出版社 / 2016-10 / 89

《游戏编程算法与技巧》介绍了大量今天在游戏行业中用到的算法与技术。《游戏编程算法与技巧》是为广大熟悉面向对象编程以及基础数据结构的游戏开发者所设计的。作者采用了一种独立于平台框架的方法来展示开发,包括2D 和3D 图形学、物理、人工智能、摄像机等多个方面的技术。《游戏编程算法与技巧》中内容几乎兼容所有游戏,无论这些游戏采用何种风格、开发语言和框架。 《游戏编程算法与技巧》的每个概念都是用C#......一起来看看 《游戏编程算法与技巧》 这本书的介绍吧!

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

Base64 编码/解码

MD5 加密
MD5 加密

MD5 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具