2010-08-03 55 views
6

我刚刚开始使用F#,当玩弄操作符重载时,我遇到了一些我不太明白的东西。现在,我明白你不能使用例如+*作为重载前缀运算符;它只能是一个中缀操作符。此处,我感到困惑,但是:F#操作符/函数混淆

let (+*) a = a + a * a;; 

如果我运行此,FSI告诉我,功能(+*)int->int。太好了,我可以挖掘它 - 它不是一个重载操作符,只是一个名为(+*)的正常函数。所以,如果我这样做:

printf "%d" ((+*) 6) 

我会得到42,因为我期望。但是,如果我尝试:

printf "%d" (+*) 6 
or 
printf "%d" (+*)6 

它不会编译。我现在无法将确切的错误提出来,因为此时我无法访问F#编译器,但为什么会这样呢?这里的绑定发生了什么?

回答

7

它解释本:

printf "%d" (+*) 6 

像这样:

printf ("%d") (+*) (6) 

换句话说,传递三个咖喱参数printf,其中第二个是向功能+*的引用。

+0

啊,这是有道理的。但是,参数的间隔语法看起来好像会使绑定混淆。以什么顺序将空间绑定参数?我习惯于带有强制括号参数的类C语言,所以这种绑定对我来说显而易见。 – Perrako 2010-08-03 00:55:23

+0

Perrako,这是一个很好的后续问题。将它作为一个单独的问题发布,以便我们对未来有一个参考(例如,“当我习惯C类参数时,如何习惯F#参数传递语法?”)。 (我很抱歉,我无法回答自己;我在F#之前学习了Lisp,所以我习惯了这种空间语法。) – 2010-08-03 04:07:26

+0

没关系,我发现这个问题可能会回答你的问题:http:// stackoverflow .com/questions/2725202/f-function-calling-syntax-confusion – 2010-08-03 04:18:47