ocaml - Lentes furtivas y CPS más allá de la restricción de valor.
lens value-restriction (0)
Estoy codificando una forma de lentes van Laarhoven en OCaml pero tengo dificultades debido a la restricción de valor.
El código relevante es el siguiente
module Optic : sig
type (-''s, +''t, +''a, -''b) t
val lens : (''s -> ''a) -> (''s -> ''b -> ''t) -> (''s, ''t, ''a, ''b) t
val _1 : (''a * ''x, ''b * ''x, ''a, ''b) t
end = struct
type (-''s, +''t, +''a, -''b) t =
{ op : ''r . (''a -> (''b -> ''r) -> ''r) -> (''s -> (''t -> ''r) -> ''r) }
let lens get set =
let op cont this read = cont (get this) (fun b -> read (set this b))
in { op }
let _1 = let build (_, b) a = (a, b) in lens fst build
end
Aquí, estoy representando una lente como un tipo de orden superior, un transformador de funciones transformadas con CPS (''a -> ''b) -> (''s -> ''t)
(como se sugirió y discutió here ). Todas las funciones de lens
, fst
y build
tienen tipos totalmente generalizados, pero su composición no tiene la misma función.
Error: Signature mismatch:
...
Values do not match:
val _1 : (''_a * ''_b, ''_c * ''_b, ''_a, ''_c) t
is not included in
val _1 : (''a * ''x, ''b * ''x, ''a, ''b) t
Como se muestra en la esencia, es perfectamente posible escribir _1
let _1 = { op = fun cont (a, x) read -> cont a (fun b -> read (b, x)) }
pero tener que construir manualmente estas lentes cada vez es tedioso y sería bueno construirlas usando funciones de orden superior como la lens
.
¿Hay alguna manera de evitar la restricción de valor aquí?