如何获得更简单但相当于Haskell表达式的版本

时间:2013-11-30 13:32:24

标签: haskell

虽然我已经学习了Haskell一段时间,但我经常遇到一个常见的问题。我们以此表达式为例:

e f $ g . h i . j

考虑到Prelude中的$.,有人可能会怀疑,eh的类型约束对于表达式有效吗?

是否有可能获得'更简单'但等效的表示?对我来说,'simpler'将是一个在任何地方都使用括号的人,并且无需定义运算符优先级规则。

如果没有,我需要阅读哪些Haskell报告部分才能获得完整的图片?

这可能与许多新手Haskell程序员有关。我知道许多程序员添加括号,这样他们就不需要记住(或理解)优先级表,如下所示:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html

1 个答案:

答案 0 :(得分:1)

是否有可能获得'更简单'但等效的表示?当然,这称为解析,由编译器,解释器等完成。

90%的时间,您需要记住的是$.和功能应用f x如何协同工作。这是因为$和函数应用程序非常简单 - 它们分别绑定最松散和最紧密的 - 它们就像加法和bodmas中的指数。

来自你的例子

e f $ g . h i . j

函数应用程序首先绑定,所以我们有

(e f) $ g . (h i) . j

函数应用程序是左关联的,所以

f g h ==> ((f g) h)

您可能需要谷歌学习才能理解为什么上述内容可以像其他语言中的foo(a, b)一样使用。

在下一步中,中间的所有内容 - 我只是使用括号或表来记住这一点,它通常很简单。例如,当您使用monad时,有几个运算符,例如>>>>=。我只是在ghc抱怨时添加括号。

所以我们没有

(e f) $ (g . ((h i) . j))

括号的顺序无关紧要,因为function composition是关联的,但是Haskell使它成为正确的关联。

那么我们就有了

((e f) (g . ((h i) . j)))

以上(简单)示例说明了为什么这些运算符首先存在。