在OCaml中命名推断类型

时间:2015-06-29 07:50:14

标签: types ocaml naming abbreviation

假设您有一个推断类型的声明:

let f x y = x +. y 

现在,如果您在其他推断类型中使用此类型:

let g h x = (if x > 0. then h else f) x x

您显然在hf之间拥有类型标识。但是,如果f的类型变得复杂并且您仍希望推断它(比如说您进行了一些代码生成),则g的类型很容易变得不可读。

有没有办法以以下形式引入类型声明:

type mytype = <type of the function f above>

让typechecker坚持下去,即在上面的例子中,它应该产生:

val g : mytype -> float -> float

2 个答案:

答案 0 :(得分:0)

你可以通过一个班级间接来做到这一点。类名代表你不能自己写的类型同义词。

let f x y = x +. y

class t = object
  method f = f
end

let f_short = new t

let g h x = (if x > 0. then h else f_short)#f x x

不幸的是,这会产生一些运行时成本。如果你是绝望的,你可以复制所有的定义,调用非类的定义,并使用其他类型的错误 - 但这将是非常模糊的。

答案 1 :(得分:0)

当然,你可以,OCaml中的一个函数只是一个常规值,它有一个类型。例如,函数f的类型是float -> float -> float。您可以为此类型创建类型缩写:

type binop = float -> float -> float

您稍后可以参考此类型,以使您的类型注释更简洁:

let g : binop -> float -> float = fun h x -> (if x > 0. then h else f) x x;

但请注意,OCaml中的类型系统是结构性的,而不是名义上的。通俗地说,这意味着,除非您通过模块抽象隐藏内容,否则不是按名称检查类型,而是按内容检查。因此,此binop只是一个缩写,类型仍为float -> float -> float