将OCaml转换为F#:如何转换OCaml Format模块的类型

Guy*_*der 3 f# ocaml types external

我正在将OCaml Format模块转换为F#; 看我早先的问题.

开始我改变了

类型大小

external size_of_int:int - > size ="%identity"

external int_of_size:size - > int ="%identity"

让size_of_int = sizeof <int>

以及我知道的一些其他调整是不正确的,但它允许我转换所有与open_box相关的代码,而close_box期望这三行.

现在我必须更改这三行,以便我可以测试我转换的格式模块的子集.

我知道在外部使用size_of_int和int_of_size的行可能依赖于F#核心中的某些功能.我也知道转换时可能会忽略%identity.

我最好的猜测是我只需要使用size_of_int和int_of_size创建一个名为size的简单类型,但是如何?

编辑

根据Jeffrey Scofield的回答,我能够创建以下F#代码.

type size =
  interface
    abstract size_of_int : int -> size
    abstract int_of_size : size -> int
  end

type size = int
let size_of_int i = i
let int_of_size s = s
Run Code Online (Sandbox Code Playgroud)

它允许我的Format模块子集成功编译.

编辑

杰克,下面回答,有一个版本在FSharpx.Compatibility.OCaml.Format.Format.fs 我还没有测试过它,但它是我目前发现的最具竞争力的版本.

Jef*_*eld 5

这些线:

type size
external size_of_int : int -> size = "%identity"
external int_of_size : size -> int = "%identity"
Run Code Online (Sandbox Code Playgroud)

创建一个与int相同的抽象类型.转换函数是无操作(标识函数).我不知道F#习语,但在OCaml中你可以使用一个接口文件,并避免使用"%identity"的聪明.

(* Interface file *)
type size
val size_of_int : int -> size
val int_of_size : size -> int

(* Implementation file *)
type size = int

let size_of_int i = i
let int_of_size s = s
Run Code Online (Sandbox Code Playgroud)

希望这更容易转化为F#.