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如何推断?
答案 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))