Мои два цента здесь.
На самом деле, если вы измените порядок выполнения на,
let add a b = a+b
(add 3.5 5.5) //returns 9.0
(add 3 4) //error
Вы увидите, что F # действительно добавляет к двум числам с плавающей запятой.(Это отвечает на ваш вопрос В F #, почему моя функция добавления не добавляет два числа с плавающей точкой)
И обратите внимание, что в этом фрагменте F # выводит функцию добавления типа как float -> float -> float.
Почему F # выводит тип функции по-разному в двух случаях, даже если вы определяете функцию точно таким же образом?
Я думаю, что когда вы определяете функцию, F # дает тип int функции.Но внутри F # остается гибким в отношении «истинного» типа функции.В первый раз, когда вы вызываете функцию, компилятор видит, как вы ее используете, и, таким образом, компилятор понимает ваше «намерение» типа функции.И компилятор корректирует тип соответствующим образом.
Как только компилятор «думает», он получает «истинный тип» функции, он становится тем, чем он является.И поскольку F # статически типизирован, вы не можете сделать второй вызов функции с аргументом другого типа.
При этом я рекомендую вам попробовать этот фрагмент.
let add a b = a + b
add "str" "ing"
Это должно сработать.
let add a b = a + b
add 5. 6.
add "str" "ing" // error, check the type
Поправь меня, если я ошибаюсь.Надеюсь, это поможет.