OCaml中的线性类型

OCaml中的线性类型,ocaml,linear-types,Ocaml,Linear Types,有一个线性系统。在OCaml中有没有(好的)方法来模拟这一点?例如,在使用ocaml lua时,我希望确保只有在lua处于特定状态时(堆栈顶部的表等)才会调用某些函数 编辑:这里有一篇关于与该问题相关的资源多态性的最新论文: 编辑2:OCaml中也有许多关于会话类型的文章,包括提供一些语法糖分的语法扩展。正如John Rivers所建议的,您可以使用一元样式来表示会话类型 “有效”计算的方式隐藏了中的线性约束 效果API。下面是一个示例,其中类型('a,'st)t 用于表示使用文件句柄(其标识为

有一个线性系统。在OCaml中有没有(好的)方法来模拟这一点?例如,在使用ocaml lua时,我希望确保只有在lua处于特定状态时(堆栈顶部的表等)才会调用某些函数

编辑:这里有一篇关于与该问题相关的资源多态性的最新论文:


编辑2:OCaml中也有许多关于会话类型的文章,包括提供一些语法糖分的语法扩展。

正如John Rivers所建议的,您可以使用一元样式来表示会话类型 “有效”计算的方式隐藏了中的线性约束 效果API。下面是一个示例,其中类型
('a,'st)t
用于表示使用文件句柄(其标识为 隐式/默示以保证其不可复制),将 生成类型为
'a
的结果,并将文件句柄保持在状态
'st
(幻象类型为“打开”或“关闭”)。你必须使用 运行单子的
以实际执行任何操作,其类型确保
确保文件句柄在使用后正确关闭

module File : sig
  type ('a, 'st) t
  type open_st = Open
  type close_st = Close

  val bind : ('a, 's1) t -> ('a -> ('b, 's2) t) -> ('b, 's2) t

  val open_ : string -> (unit, open_st) t
  val read : (string, open_st) t
  val close : (unit, close_st) t

  val run : ('a, close_st) t -> 'a
end = struct
  type ('a, 'st) t = unit -> 'a
  type open_st = Open
  type close_st = Close

  let run m = m ()

  let bind m f = fun () ->
    let x = run m in
    run (f x)

  let close = fun () ->
    print_endline "[lib] close"

  let read = fun () ->
    let result = "toto" in
    print_endline ("[lib] read " ^ result);
    result

  let open_ path = fun () -> 
    print_endline ("[lib] open " ^ path)
end    

let test =
  let open File in
  let (>>=) = bind in
  run begin
    open_ "/tmp/foo" >>= fun () ->
    read >>= fun content ->
    print_endline ("[user] read " ^ content);
    close
  end
当然,这只是想让你尝一尝 应用程序编程接口。有关更重要的用途,请参见Oleg的示例

您可能还对研究编程语言感兴趣 ,目的是 是ML的一个变体,具有更细粒度的状态控制(和相关 有效模式)通过线性输入规程,使用 资源。请注意,这只是目前的一个研究实验,而不是 实际上是针对用户的。也是相关的,, 虽然最后不那么喜欢。生锈可能是一个合理的选择 这些实验的“实际”对应物


1:它实际上不是单子,因为它没有
返回
/
单元
组合符,但关键是要像单子
绑定
操作符那样强制类型控制排序。它可能有一个
映射

您可以使用monads在monadic bind中隐藏“线性”类型处理,并且只将monadic类型导出为抽象类型。您所说的模拟是什么意思?运行时检查?不,静态。“模拟”是指使用现有的类型系统来实现(接近)线性类型系统。这里有一些关于依赖类型的有趣研究:您能提供一个使用示例吗?我还没有弄到monad这个东西P@OlleHärstedt:最后有一个用法示例(
let test…
)。或者您还需要其他东西吗?出于好奇,是否可以定义一个与堆栈状态完全对应的幻影类型?在Lua和OCaml/C之间通信时,我们使用一个堆栈:
Lua.newtable state;;(*将新表放入堆栈*)Lua.pushstring状态“索引”;;(*将表索引放在堆栈*)
因此幻影类型现在类似于
[string,table]
。如何交替读取两个文件中的行并将它们写入第三个文件?