我有一个非常有趣的第一个学习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,非常感谢您的帮助。
答案 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
类型。