Ограничение значений в ML предотвращает обобщение типов в контекстах, где это может нарушить безопасность типов. Основная проблема, по-видимому, возникает из-за комбинирования последовательных мутаций и полиморфных типов, как, например, в этом коде OCaml:
let x = ref [];; (* value restriction prevents generalization here *)
x := 1::!x;; (* type unification with int *)
x := true::!x;; (* error *)
Без ограничения значения последняя строка будет проверяться без ошибок, поскольку полиморфный тип для x
будет объединен с bool
. Чтобы этого не произошло, тип x
должен оставаться мономорфным.
У меня следующий вопрос: можно ли снять ограничение значения, используя монады для выражения последовательностей операций?
В качестве аргументов функции переменные, введенные посредством операции bind
монады, остаются мономорфными на протяжении всей последовательности, поэтому, похоже, достигается тот же эффект, что и ограничение значения, без введения особых случаев во время обобщения.
Сработает ли это, а если нет, то почему?