在这种情况下,OCaml如何推断出类型?

时间:2014-04-25 09:57:44

标签: ocaml

type 'a lazy_node = 
  | Empty
  | Node of 'a * 'a lazy_list
and 'a lazy_list = 'a lazy_node lazy_t

let con x zl = lazy (Node (x,zl))

因此,此处应定义两种类型:'a lazy_node'a lazy_list

我认为con的类型是'a -> 'a lazy_list -> 'a lazy_list

但是,实际上当我在utop中尝试时,它给了con这样的类型:

val con : 'a -> 'a lazy_list -> 'a lazy_node lazy_t = <fun>


为什么返回类型不是'a lazy_list?在这种情况下,OCaml如何推断?

1 个答案:

答案 0 :(得分:3)

在您的代码中lazy_list不是新类型,而只是lazy_node lazy_t的别名。而Ocaml类型的推理器只考虑实际类型,而不是别名。因此,它推断出真实类型,并且不会检查此类型是否存在别名。

别名用于参数,因为Node (x,zl)表示zl的类型为'a lazy_list

您可以添加类型注释以强制使用别名:

let con x zl: 'a lazy_list = lazy (Node (x,zl))