正如你们许多人已经知道的那样,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行有一个语法错误,这是第一个其他的行,但我看不出我的if和else语句有什么问题。
OCaml中的;
运算符用于分隔两个值。但是在代码中第一个;
之后没有第二个值。
您可能习惯于使用其他语言(例如C)来使用;
,其中;
用于终止所有表达式语句。
要修复语法错误,请删除此代码中的第一个;
。
修复此错误后,您遇到类型错误。您的函数返回了两个值(在不同的情况下)。一个是由printf
电话回来的。它返回unit
类型的值(因为它实际上没有计算值)。另一个由列表表达式(((List.hd lst)::(list_above thresh List.tl lst)))
返回。这个值是某种列表。
因为unit
不是列表类型,所以此代码不正确。函数必须在所有情况下返回相同类型的值。