Вам нужно несколько скобок.
let rec sum m n f=
if m>n then 0
else if m=n then f n
else f m + sum n (m+1) f
(Хотя для удобства чтения я обычно заключал бы в скобки последнюю строку, как иначе (f m) + (sum n (m+1) f)
.)
Что происходит без скобок, так это то, что он обрабатывает его как (f m) + (sum n m) + (1 f)
, что приводит к ошибке, что sum n m
не имеет тип int, поскольку это приложение с частичной функцией более сложного типа.
Как правило, когда выражение передается в качестве аргумента функции, оно всегда должно заключаться в скобки. Что касается примечания, если вы когда-нибудь действительно хотели передать функцию плюс в качестве аргумента, вы бы поставили ее в скобки (например: sum m n (+)
(хотя в этом случае проверка типов не выполнялась бы, так как + ожидает два числа) ).