【问题标题】:OCaml typesystem unintended nestingOCaml 类型系统意外嵌套
【发布时间】:2014-06-15 21:20:04
【问题描述】:

在 OCaml 顶层中,我有以下类型定义:

type 'a lazy_list =
| Nil
| Cons of 'a * 'a lazy_list
| LazyCons of 'a * 'a lazy_list

(本例已简化)

还有这个函数定义:

let head = function
| Nil -> Nil
| Cons(x,_) | LazyCons(x,_) -> x

ocaml 顶层告诉我head 的类型是'a lazy_list lazy_list -> 'a lazylist 为什么不是'a lazy_list -> 'a,这是我所期望的?

【问题讨论】:

    标签: ocaml type-inference algebraic-data-types


    【解决方案1】:

    您的函数的一个可能结果是Nil。 Nil 是 lazy_list。因此,对于某些(或可能所有)类型t,head 的结果类型必须是t lazy_list。

    head 的另一个可能结果是x,其中x 是给定列表的一个元素。因此head的结果类型必须是给定列表的元素类型。

    通过结合这两条信息,我们可以得出结论,给定列表的元素类型本身必须是一个列表。因此,您的函数只能对列表列表进行操作。

    如果head 的类型仅仅是'a laty_list -> 'a,Nil 将不是它的有效结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-29
      • 2017-07-28
      • 1970-01-01
      • 2012-09-23
      • 1970-01-01
      • 2021-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多