dor*_*mon 1 polymorphism ocaml types parametric-polymorphism
如果我有以下功能:
let rejected f = (f 1, f "hi");;
Run Code Online (Sandbox Code Playgroud)
它被类型检查器拒绝,我真的不明白为什么类型检查拒绝它.因为f可以是多态函数(比如说id),类型检查器应该允许它.有人可以解释一下吗?
这是由于"让多态",又称"prenex多态",又名"ML式多态".搜索此条款将为您提供有关此信息的一些信息.
在外行人看来,这就是类型推理的工作原理,有些时候你需要停止概括,并修复你的类型变量.在ML风格的多态性中,这是在一个let级别上完成的.因此,let绑定中的函数应该统一使用,即使用相同的参数.如果这对您来说是个问题,那么您可以使用记录,对象或(可能)该语言的其他一些功能来克服它.以下是OCaml FAQ的摘录:
如何用多态参数编写函数?在ML中,函数的参数在函数体内不能是多态的; 因此输入以下内容:
let f (g : 'a -> 'a) x y = g x, g y
val f : ('a -> 'a) -> 'a -> 'a -> 'a * 'a = <fun>
Run Code Online (Sandbox Code Playgroud)
该功能不像我们希望的那样具有多态性.然而,在OCaml中,可以使用一阶多态性.为此,您可以使用记录或对象; 在记录的情况下,您需要在函数中使用之前声明类型.
let f (o : <g : 'a. 'a -> 'a>) x y = o#g x, o#g y
type id = { g : 'a. 'a -> 'a; }
let f r x y = r.g x, r.g y
Run Code Online (Sandbox Code Playgroud)