潜行镜头和CPS超过了价值限制

时间:2015-03-21 19:49:40

标签: ocaml lens value-restriction

我编码a form of van Laarhoven lenses in OCaml但由于价值限制而遇到困难。

相关代码如下

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

在这里,我将镜头表示为高阶类型,CPS变换函数的变换器('a -> 'b) -> ('s -> 't)(如建议here并讨论here)。函数lensfstbuild都具有完全广义的类型,但它们的组成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等高阶函数构建它们会很不错。

这里有价值限制吗?

0 个答案:

没有答案