在长度函数上键入错误

时间:2016-02-18 09:10:52

标签: ocaml

我有一个非常有趣的第一个学习OCaml的项目,在创建了类似的list类型之后:

type 'a my_list = Item of ('a * 'a my_list) | Empty;;

并填写如下:

let num_list = Item (1, Item (2, Item(3, Empty)));;

我必须重新编写列表模块的许多功能,这些功能将适用于我的新列表类型,如上所示。

我从Length开始,听起来最简单,也是最好的开始。

这是我到目前为止所拥有的:

let rec length my_list =
match my_list with
| [] -> 0
| head::rest -> 1 + (length rest);;

哪个有正确的定义:

val length : 'a list -> int = <fun>

但是当我通过新创建的列表时,我收到以下错误:

  

错误:此表达式的类型为int my_list          但是期望表达式是一个列表

我错过了什么?

到目前为止,我很享受OCaml,非常感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

您实际上并未使用自己的'a my_list类型,而是使用原始'a list

您的函数必须进行模式匹配,而不是'a list,而是'a my_list

let rec my_length my_list = 
  match my_list with
  | Empty -> 0
  | Item (_, rest) -> 1 + (my_length rest);;

您现在获得的类型是:

val my_length : 'a my_list -> int = <fun>

现在您使用的是自己的'a my_list类型。