Подтвердить что ты не робот

Прозрачные линзы и CPS минус ограничение стоимости

Я кодирую форму линз ван Лаарховена в OCaml, но у меня возникают трудности из-за ограничения значения.

Соответствующий код выглядит следующим образом

module Optic : sig
  type (-'s, +'t, +'a, -'b) t
  val lens : ( -> 'a) -> ( -> '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) -> ( -> ('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

Здесь я представляю объектив как тип более высокого порядка, трансформатор CPS-преобразованных функций ('a -> 'b) -> ( -> 't) (как было предложено здесь и обсуждался здесь). Функции lens, fst и build все имеют полностью обобщенные типы, но их состав lens fst build не имеет.

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

Как показано в тексте, вполне возможно написать _1

let _1 = { op = fun cont (a, x) read -> cont a (fun b -> read (b, x)) }

но при этом вручную создавать эти линзы каждый раз утомительно, и было бы неплохо построить их, используя функции более высокого порядка, такие как lens.

Есть ли способ ограничения значения здесь?

4b9b3361