F#操作员/功能混乱

Per*_*ako 6 f# function operator-overloading

我刚刚开始使用F#,当玩弄运算符重载时,我遇到了一些我不太了解的东西.现在,我明白你不能使用,例如,+*作为重载前缀运算符; 它只能是一个中缀运算符.然而,这是我感到困惑的地方:

let (+*) a = a + a * a;;
Run Code Online (Sandbox Code Playgroud)

如果我运行它,fsi告诉我该函数(+*)是一个int->int.太好了,我可以挖掘它 - 它不是一个重载的运算符,只是一个名为的普通函数(+*).所以,如果我这样做:

printf "%d" ((+*) 6)
Run Code Online (Sandbox Code Playgroud)

正如我所料,我会得到42分.但是,如果我尝试:

printf "%d" (+*) 6
or
printf "%d" (+*)6
Run Code Online (Sandbox Code Playgroud)

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

mun*_*ent 7

它正在解释这个:

printf "%d" (+*) 6
Run Code Online (Sandbox Code Playgroud)

像这样:

printf ("%d") (+*) (6)
Run Code Online (Sandbox Code Playgroud)

换句话说,传递三个curried参数printf,第二个参数是函数的引用+*.

  • ")"和"6"在表达式中是单独的词法标记,因此它的工作方式与"1 + 3*4"相当于"1 + 3*4"的方式相同.顺便说一句,你可以使用向后管道来控制优先级,所以printf"%d"<| (+*)6会奏效. (3认同)