2013-02-08 17 views
2

我在写一个自定义语言,它具有一些功能元素。当我陷入某个地方时,我通常会检查Haskell是如何做到的。这一次,这个问题有点复杂,让我想起一个给Haskell的例子。Haskell如何知道哪个函数可以先运行?

这是怎么回事。

说我们有在Haskell以下行

a . b 

。显然,我们正在编写两个函数a和b。但是,如果函数又将另外两个函数作为参数呢?什么阻止了它的运行。和b?您可以将它括在括号中,但这应该没有什么区别,因为表达式仍然计算为函数,前缀一,前缀函数优先于中缀函数。

如果你

(+) 2 3 * 5 

例如,它会输出25,而不是17

基本上要问什么,我是,当你想要一个中缀功能操作不哈斯克尔用什么机制在前面的前缀函数之前。

所以。如果“a”是一个以两个函数为参数的函数。你如何去解释

a . b 

为“适用。和B功能的” 停止Haskell和它解释为“组合功能a和b”。

+2

所以这基本上是一个关于这种表达式的解析的问题? – leftaroundabout 2013-02-08 12:00:41

+0

我总是可以想到一些解决这些问题的解决方案,但我真的很想知道它是如何在Haskell中实现的。也许没有实现,它是如何工作的。 – 2013-02-08 12:02:36

+0

我真的不明白这个问题吗? – Cubic 2013-02-08 12:10:43

回答

11

如果你没有在操作员周围放置pa子,它总是解析为中缀;即作为操作员,而不是操作数。
例如如果您有f g ? i j,那么?附近没有任何包袱,因此整个事情是致电(?)(解析为(f g) ? (i j),相当于(?) (f g) (i j))。

+1

有趣。所以你在说,如果f把2个函数作为参数,它仍然不会采取?因为它是一个中缀函数? – 2013-02-08 12:34:19

+6

@LukaHorvat不是因为它是中缀函数,而是因为它是中缀名*。它完全基于语法。 – 2013-02-08 13:15:39

1
(+) 2 3 * 5 

被解析为

((+) 2 3) * 5 

因此

(2 + 3) * 5 

即,由于功能的应用程序(如(+) 2 3)获得第一评价,在缀表示法的功能,如前*

+0

我了解如何和为什么这样的作品。当我用括号括起来时,我只是用它作为转动前缀的函数的一个例子。 – 2013-02-08 12:21:28

4

我认为你要找的是固定性声明(见The Haskell Report)。

他们基本上允许你声明中缀函数的运算符优先级。

例如,有

infixl 7 * 
infixl 6 + 

这意味着+*都是左结合中缀运算符。 *优先7,而+优先6,我。e *结合强于+。 在报告页面,你还可以看到.被定义为infixr 9 .

+2

此外,功能应用程序绑定比任何中缀运算符更紧密。 (并且记录语法/更新绑定甚至比这更严格。) – 2013-02-08 15:54:44

+0

和':info'在GHCi中用于检查运算符固定性 – jberryman 2013-02-08 16:00:52

3

基本上我问的是,它哈斯克尔使用什么样的机制,当你想 中缀函数前面的前缀函数之前运行。

只是指出一个误解:这纯粹是表达式如何解析的问题。 Haskell的编译器不知道(或:并不需要知道)如果在

f . g 

f,g和是函数,或任何()。

它去周围的其他方法:

  1. 解析器看到f . g(或者,在语法上是等价的:i + j
  2. 手这件事,就像这样App (App (.) f) g以下的词汇和语法规则。
  3. 只有当typechecker看到App a b时,它得出结论a必须是一个函数。
+0

但它的词法和语法规则会告诉它将其解析为App(App(f(。 ))g' – 2013-02-08 14:09:13

+1

如果是这样,那么2 + 3也会被解析为'App(App 2(+))3',这是无意义的。 – Ingo 2013-02-08 14:22:26

+0

这意味着Haskell显然必须知道什么是函数,什么是函数如果函数是中缀形式,甚至需要知道优先级 – 2013-02-09 04:36:05

相关问题