Полиморфная функция как возвращаемое значение и ограничение значения в SML - PullRequest
4 голосов
/ 28 января 2010

По сути, я хочу иметь функцию для возврата полиморфной функции, что-то вроде этого:

fun foo () = fn x => x

Таким образом, функция foo принимает значение типа type и возвращает полиморфную функцию тождества. и компилятор доволен этим, он дает мне:

val foo = fn: unit -> 'a ->' a

но когда я на самом деле вызываю функцию foo, возвращаемое значение не соответствует ожидаемому

val it = fn:? .X1 ->? .X2

Не может обобщить из-за ограничения значения, какая-либо помощь? заранее спасибо

1 Ответ

4 голосов
/ 29 января 2010

По техническим причинам вам не разрешено обобщать (то есть делать полиморфными) результаты вызова функции. Результат вызова должен иметь мономорфный тип. Если бы это было не так, вы могли бы подорвать систему типов с помощью следующего подвоха:

  1. Позвоните ref [] и получите список типа forall 'a . 'a list ref
  2. Вставить строку.
  3. Удалить функцию

и вот, пожалуйста: вы выполняете содержимое произвольной строки как код. Не хорошо.

Настаивая на том, что значение, возвращаемое ref [], должно быть мономорфным, вы гарантируете, что оно может использоваться в качестве списка строк или списка функций, но не обоих. Так что это часть цены, которую мы платим за безопасность типов.

...