Путаница Оператора/Функции F#

Я только начинаю работать на F#, и когда я играю с перегрузкой оператора, я столкнулся с чем-то, что я не совсем понимаю. Теперь, я понимаю, что вы не можете использовать, например, +* как перегруженный префиксный оператор; это может быть только оператор infix. Вот где я запутался, однако:

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

если я запускаю это, fsi говорит мне, что функция (+*) это int->int. Отлично, я могу это понять - это не перегруженный оператор, просто нормальная функция с именем (+*). Итак, если я это сделаю:

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

я получу 42, как и ожидал. Однако, если я попытаюсь:

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

он не будет компилироваться. Я не могу поставить точную ошибку прямо сейчас, так как у меня нет доступа к компилятору F# в данный момент, но почему это? Что здесь происходит со связыванием?

1 ответов


он интерпретирует это:

printf "%d" (+*) 6

такой:

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

другими словами, передавая три аргумента Карри printf, вторая из которых является ссылкой на функцию +*.