我刚开始使用F#,当玩弄运算符重载时,我遇到了一些我不太了解的东西。现在,我知道您不能使用+*
作为重载前缀运算符;它只能是一个中缀运算符。然而,这是我感到困惑的地方:
let (+*) a = a + a * a;;
如果我运行这个,fsi告诉我函数(+*)
是int->int
。好的,我可以挖掘它 - 它不是一个重载的运算符,只是一个名为(+*)
的普通函数。所以,如果我这样做:
printf "%d" ((+*) 6)
我会得到42,正如我所期望的那样。但是,如果我尝试:
printf "%d" (+*) 6
or
printf "%d" (+*)6
它不会编译。我现在无法提出确切的错误,因为此时我无法访问F#编译器,但为什么会这样?绑定在这里发生了什么?
答案 0 :(得分:7)
它正在解释这个:
printf "%d" (+*) 6
像这样:
printf ("%d") (+*) (6)
换句话说,将三个curried参数传递给printf
,其中第二个是对函数+*
的引用。