F # полиморфные типы - PullRequest
       32

F # полиморфные типы

4 голосов
/ 19 декабря 2010

Следующее работает отлично, как и следовало ожидать в полиморфной системе типов в стиле 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, где неуказанный тип фактически является универсальным, либо блокировать только одну версиюфункции, но, насколько я могу видеть, он делает первое в первом случае и второе во втором случае.Я предполагаю, что за поведением стоит какая-то логика, которую я просто не замечаю.Чего мне не хватает?

1 Ответ

6 голосов
/ 19 декабря 2010

Здесь происходит нестандартная вещь с "типами шляп". Некоторые функции F #, такие как 'string', имеют типы, основанные на статических ограничениях оптимизации или существовании определенных функций-членов. Они могут быть обобщены только в «встроенных» функциях, в противном случае они принимают мономорфный тип, основанный на использовании, и вот что здесь происходит.

...