假设您有一个推断类型的声明:
let f x y = x +. y
现在,如果您在其他推断类型中使用此类型:
let g h x = (if x > 0. then h else f) x x
您显然在h
和f
之间拥有类型标识。但是,如果f
的类型变得复杂并且您仍希望推断它(比如说您进行了一些代码生成),则g
的类型很容易变得不可读。
有没有办法以以下形式引入类型声明:
type mytype = <type of the function f above>
让typechecker坚持下去,即在上面的例子中,它应该产生:
val g : mytype -> float -> float
答案 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