正如许多人已经知道的那样,Ocaml的错误消息传递确实很糟糕,我被困住了。我试图搜索问题,但是错误消息过于模糊,无法搜索。以下代码应该使用递归方法过滤掉所有超过某个阈值的数字。
let rec list_above thresh lst =
if lst = [] then
printf("Herewego");
else
begin
if (List.hd lst) >= thresh then
(((List.hd lst)::(list_above thresh List.tl lst)))
else if (List.hd lst) < thresh then
((list_above thresh List.tl lst));
end
;;
它总是说在第53行存在语法错误,这是与else的第一行,但是我的if and else语句看不到任何错误。
答案 0 :(得分:3)
OCaml中的;
运算符用于分隔两个值。但是在代码中,第一个;
之后没有第二个值。
您可能习惯于使用C等其他语言;
,其中;
用于终止所有表达式语句。
要解决语法错误,请删除此代码中的第一个;
。
修复此错误后,您遇到类型错误。您的函数返回了两个值(在不同情况下)。 printf
调用返回一个。它返回类型为unit
的值(因为它实际上并没有计算值)。另一个由列表表达式(((List.hd lst)::(list_above thresh List.tl lst)))
返回。此值是某种列表。
由于unit
不是列表类型,因此此代码不正确。在所有情况下,函数都必须返回相同类型的值。