我试图围绕OCaml的类型推断符号包裹我的头。OCaml中的类型推理
例如:
# let f x = x [];;
val f : ('a list -> 'b) -> 'b = <fun>
对我来说很有意义。 val f需要一个函数x,它接受一个'a类型的列表并返回'b类型的东西。然后f返回一个'b类型,因为它只是调用x。
但是,一旦我们得到更多的论据,我会变得更加困惑。
# let g a b c = a b c;;
val g : ('a -> 'b -> 'c) -> 'a -> 'b -> 'c = <fun>
我可以假设如果函数有参数,那么类型推断的第一个参数将始终是参数?如果我称之为b c,是((a b)c)还是(a(b c))的顺序?
# let rec h m n ls = match ls with
| [] -> n
| x::t -> h m (m n x) t;;
val h : ('a -> 'b -> 'a) -> 'a -> 'b list -> 'a = <fun>
作为该一个我很困惑,如何( '一个 - >' B - > '一) - >' 一个推导。我可以看到'b列表对应于ls变量,最后'a对应于终端符号n的类型。
太谢谢你了!这为我清理了很多。如果您不介意回答,我只需再做一次后续处理:如果我们不知道类型推断,只能从方程式中找出答案,该怎么办?你如何知道m的第二个arg a.k.a. x是'b'类型的,与'a'不一样? –
@ChangLiu对于像你这样简单的功能,你可以通过统一来推断。以一种非常幼稚的方式,分配类型为''''''''的''''''''''''''''''''''''''''''类型''''''''''''''''''' ,你可以为这些变量定义方程,并求解方程以得出最基本的类型(''''''''''''''''''''')。您可以搜索“算法W”以获取更多关于类型推断的信息。或者,你可以在OCaml中编程更多,这样你就可以更快地进行推理:) – objmagic