Можно ли написать функцию слабо полиморфизма без использования ссылки или частичного применения?
let remember =
let cache = ref None in
(fun x -> match !cache with
| Some y -> y
| None -> cache := Some x; x)
слабо полиморфизм, но с участием ref
,
Любые способы написать слабо полиморфную функцию без участия ref
или же partial application
?
2 ответа
Конечно. Модульная абстракция сделает это, по сути инструктируя компилятор отказаться от всей информации о реализации:
module Example : sig
type 'a t
val create : unit -> 'a t
end = struct
type 'a t = int
let create () = 0
end
и слабо полиморфный результат:
# let x = Example.create ();;
val x : '_a Example.t = <abstr>
(Обратите внимание, что если бы вы хотели полиморфизм здесь, вы бы использовали аннотации дисперсии, чтобы восстановить его.)
Также легко создавать примеры на основе изменяемых структур, кроме ref
(массивы, изменяемые поля), но это не очень поучительно, так как это одно и то же.
Это возможно с другими изменяемыми структурами данных, такими как массив, bigarray, объекты и другие структуры, которые имеют конструкцию формы create: unit -> 'a t
, или же create: some_type -> 'a t
, так что они могут быть созданы без фактического доказательства компилятору, что они будут иметь указанный тип.