我的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
答案 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时运行良好。)