递归列表创建功能。类型错误

时间:2012-09-26 21:04:17

标签: recursion ocaml

我的Ocaml功能给了我错误。

我想做什么:

递归创建大小为“limit”的随机数列表(0-2)。

这就是我所拥有的:

let rec carDoorNumbers = fun limit -> 
match limit with
| [1] -> Random.int 3
| [] -> Random.int 3 :: carDoorNumbers (limit-1);;

我收到此错误:

Error: This expression has type 'a list
   but an expression was expected of type int

2 个答案:

答案 0 :(得分:3)

考虑一下你的功能必须做什么:给定一个限制,你必须创建一个列表的数字。所以你的类型就像carDoorNumbers : int -> int list

看着它,似乎你有两个错误。首先,您要对列表模式匹配limit(应该是int)。 [1] -> ...匹配仅包含元素1的列表,[]匹配空列表;您确实希望与号码1和任何其他号码n匹配。

第二个错误是您在match语句中返回两种不同的类型。请记住,您应该返回一个列表。在第一种情况下,您将返回Random.int 3,这是int而不是int list。你真正想要回到这里的是[Random.int 3]

你得到的错误有点令人困惑。由于您返回的第一件事是int,因此您希望 的第二件事是int。但是,你的第二个案例实际上是正确的:你返回int list!但是,编译器不知道你的意思,所以它的错误是倒退的;您需要将int list更改为int,而不是将int更改为int list

答案 1 :(得分:2)

您的match表达式将限制视为列表。 [1][]都是列表。这就是编译器告诉你的。但似乎限制应该是一个整数。

要匹配整数,只需使用整数常量。没有方括号。

(作为旁注,您可能希望确保该函数在传递0时运行良好。)