Следующее работает отлично, как и следовало ожидать в полиморфной системе типов в стиле Curry, где, например, функция тождества на самом деле представляет собой бесконечное семейство функций, по одному для каждого типа 'a ->' a:
let f x = x
printfn "%A" (f 2)
printfn "%A" (f 3.4)
Но когда мы пытаемся сделать что-то более сложное, в третьей строке происходит сбой, «ожидалось, что это выражение будет иметь тип int, но здесь имеет тип float»:
let f x = string x
printfn "%A" (f 2)
printfn "%A" (f 3.4)
(Но комментируявторая строка заставляет третью строку работать, как и ожидалось.)
Априори, я бы ожидал, что вывод типа будет либо вести себя в стиле Curry, где неуказанный тип фактически является универсальным, либо блокировать только одну версиюфункции, но, насколько я могу видеть, он делает первое в первом случае и второе во втором случае.Я предполагаю, что за поведением стоит какая-то логика, которую я просто не замечаю.Чего мне не хватает?