F # между let add1 x = x + 1 и add2 x = x +1

В чем разница между let add1 x = x + 1 и let add2 x = x +1. Случайное удаление пространства изменило тип функции из
val add1: x:int->int to
val add2: x:(int → 'a) → 'a

Насколько я понимаю, первый оператор типа говорит add1 maps int int. Но в чем смысл второго.

Ну, 'a представляет общий тип, но как функция 'add2' возвращает общий?

Спасибо за вашу помощь.

Ответ 1

То, что причуда синтаксиса F #: знак "плюс" или "минус", за которым следует буква буква, обрабатывается как положительное или отрицательное число соответственно, а не как оператор, за которым следует число.

> 42
it : int = 42

> +42
it : int = 42

> -42
it : int = -42

Таким образом, ваш второй пример let add2 x = x +1 эквивалентен let add2 x = x 1. Выражение x 1 означает, что x является функцией и применяется к аргументу 1, что именно то, что вам говорит ваш тип:

add2 : x:(int -> 'a) -> 'a

Это говорит о том, что add2 принимает функцию с именем x, которая принимает int и возвращает некоторую 'a, а сама add2 также возвращает тот же 'a.