为什么if语句出现Ocaml语法错误?

时间:2018-09-14 01:08:50

标签: ocaml

正如许多人已经知道的那样,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语句看不到任何错误。

1 个答案:

答案 0 :(得分:3)

OCaml中的;运算符用于分隔两个值。但是在代码中,第一个;之后没有第二个值。

您可能习惯于使用C等其他语言;,其中;用于终止所有表达式语句。

要解决语法错误,请删除此代码中的第一个;

修复此错误后,您遇到类型错误。您的函数返回了两个值(在不同情况下)。 printf调用返回一个。它返回类型为unit的值(因为它实际上并没有计算值)。另一个由列表表达式(((List.hd lst)::(list_above thresh List.tl lst)))返回。此值是某种列表。

由于unit不是列表类型,因此此代码不正确。在所有情况下,函数都必须返回相同类型的值。

相关问题