ocaml lens value-restriction

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í?