Function F#操作员/功能混淆

Function F#操作员/功能混淆,function,f#,operator-overloading,Function,F#,Operator Overloading,我刚刚开始学习F#,在处理操作符重载时,遇到了一些我不太理解的问题。现在,我知道您不能使用,例如,+*作为重载前缀运算符;它只能是中缀运算符。然而,我感到困惑的是: let (+*) a = a + a * a;; 如果我运行这个函数,fsi会告诉我函数(++*)是一个int->int。很好,我能理解——它不是重载运算符,只是一个名为(++*)的普通函数。因此,如果我这样做: printf "%d" ((+*) 6) 我会得到42分,正如我预期的那样。但是,如果我尝试: printf "%d

我刚刚开始学习F#,在处理操作符重载时,遇到了一些我不太理解的问题。现在,我知道您不能使用,例如,
+*
作为重载前缀运算符;它只能是中缀运算符。然而,我感到困惑的是:

let (+*) a = a + a * a;;
如果我运行这个函数,fsi会告诉我函数
(++*)
是一个
int->int
。很好,我能理解——它不是重载运算符,只是一个名为
(++*)
的普通函数。因此,如果我这样做:

printf "%d" ((+*) 6)
我会得到42分,正如我预期的那样。但是,如果我尝试:

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

它不会编译。我现在不能给出确切的错误,因为我现在无法访问F#编译器,但这是为什么呢?这里的绑定是怎么回事?

它解释了这一点:

printf "%d" (+*) 6
像这样:

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

换句话说,将三个curried参数传递给
printf
,第二个参数是对函数
+*

的引用,这有一定的意义。然而,参数的间距语法似乎会使绑定变得混乱。以什么顺序绑定参数?我已经习惯了用强制括号作为参数的类C语言,所以这种绑定对我来说是显而易见的。Perrako,这是一个很好的后续问题。将其作为一个单独的问题发布,以便我们将来有一个参考(即“当我习惯于C类参数时,如何习惯F#参数传递语法?”)。(很抱歉,我不能回答自己的问题;我在F#之前学过Lisp,所以我习惯了这种空格语法。)没关系,我找到了这个可能会回答你的现有问题:谢谢链接!它确实回答了这个问题,但不是非常直接。使用
printf“%d”(++*)6
,它从左到右调用类似于:
6 |>printf“%d”
。这是有道理的。我不太确定的是省略了空格的版本;也就是说,
printf“%d”(++*)6
编译器如何/为什么可以在那里插入一个空格,从而使它们成为单独的参数?在表达式中“)”和“6”是单独的词汇标记,因此其工作方式与“1+3*4”等价于“1+3*4”的工作方式相同。顺便说一句,您可以使用反向管道来控制优先级,因此printf“%d”