Небольшая разница в типах

У меня есть три функции, которые должны быть равны:

let add1 x = x + 1
let add2 = (+) 1
let add3 = (fun x -> x + 1) 

Почему различаются типы этих методов?
add1 и add3 являются int -> int, но add2 - (int -> int). Они все работают так, как ожидалось, мне просто интересно, почему FSI представляет их по-другому?

Ответ 1

Это, как правило, неважное различие, но если вам действительно интересно, см. раздел Arity Conformance for Values ​​ спецификации F #.

Мое быстрое резюме состояло бы в том, что (int -> int) является надмножеством int -> int. Поскольку add1 и add3 являются синтаксическими функциями, они предполагаются для более специфического типа int -> int, тогда как add2 является значением функции и поэтому предполагается, что имеет тип (int -> int) (и не может рассматриваться как a int -> int).