Почему частичное заявление имеет ограничение по стоимости?
я могу понять, чтоallowing mutable
является причиной ограничения стоимости и слабого полиморфизма. По сути, изменяемая ссылка внутри функции может изменить используемый тип и повлиять на будущее использование функции. Таким образом, реальный полиморфизм не может быть введен в случае несоответствия типов.
Например,
# let remember =
let cache = ref None in
(fun x ->
match !cache with
| Some y -> y
| None -> cache := Some x; x)
;;
val remember : '_a -> '_a = <fun>
В помните, кеш изначально был'a option
, но как только он вызывается в первый разlet () = remember 1
, кеш становитсяint option
, таким образом, тип становится ограниченным. Ограничение стоимости решает эту потенциальную проблему.
Что я до сих пор не понимаю, так это ограничение стоимости частичного применения.
Например,
let identity x = x
val identity: 'a -> 'a = <fun>
let map_rep = List.map identity
val map_rep: '_a list -> '_a list = <fun>
в вышеприведенных функциях я не вижу ни ref, ни изменяемого места, почему все еще применяется ограничение значения?