4

我有一个给我错误的 Ocaml 函数。

我正在尝试做的事情:

递归地创建大小为“限制”的随机数 (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
4

2 回答 2

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 listint,您需要将 更改intint list

于 2012-09-26T21:11:09.190 回答
2

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

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

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

于 2012-09-26T21:11:06.710 回答