繁体   English   中英

Ocaml函数的语法错误

[英]Syntax Error in Ocaml Function

我在此函数的最后一行收到语法错误:

let rec countAll(doorlist, count) =
    let listdoor = [];
    countZero(doorlist, count) :: listdoor;
    countOne(doorlist, count) :: listdoor;
    countTwo(doorlist, count) :: listdoor;;

我可能对如何从Ocaml函数返回某些内容感到困惑。 我想返回“ listdoor”,它应该是包含countZero,countZero和countTwo函数输出的列表。

我在此代码的最后一个lint,最后几个字符上遇到语法错误:

File "MonteeHall.caml", line 30, characters 38-40:
Error: Syntax error

要添加到Jeffrey的答案中,您似乎打算分三步将项目添加到Listdoor。 混乱是关于...的含义; ::在ocaml中。 您和我都习惯于按顺序进行编程,就像我们在其他语言中所做的那样。

=右边的所有内容都是一个对函数返回值求值的大表达式。 这就是从ocaml中的函数返回值的方式。

当表达有; 在其中; 是子表达式之间的分隔符。 每个子表达式都会被求值,除最后一个子表达式的返回值之外的所有返回值都将被丢弃(尽管这些子表达式并非没有用,使用;的原因是为了积累副作用)。

但是::不会产生副作用-缺点只是具有返回值的函数。

因此,您的行countZero(doorlist,count) :: listdoorcountOne(doorlist,count) :: listdoor都产生了一个新列表,但是这些列表中的每一个都被丢弃了。

如果要保持含义相同并按顺序构建列表,可以通过使用let和in存储累积的步骤来做到这一点:

let countAll(doorlist,count) =
    let step1 = [] :: countZero(doorlist,count) in
    let step2 = step1 :: countOne(doorlist,count) in
    let step3 = step2 :: countTwo(doorlist,count) in
    step3
;;

如果保留所有这些中间名称似乎不如您在发布中考虑的一系列串联方式有效,那是因为如果您以类似于您所给的口头描述的方式来表达功能,而不是用这种方式来表达,则这种事情会更简洁其他语言鼓励您提出的顺序方式。 如果要将三个函数的结果收集到一个列表中,则只需执行以下操作:

let collectResults (a,b) = 
    [ fun1 (a,b) ;  fun2 (a,b) ; fun3 (a,b) ]
;;

您是否看到返回值( =右边的所有内容)与您对函数的描述如何匹配:“应该是包含函数输出的列表”? (注意:方括号内的分号分隔列表中的元素-含义与;的更早版本!)

其他两个小要点:

如果您定义的函数没有调用自身,则无需将其声明为“ rec”。 但是,也许杰弗里的直觉是正确的,实际上,您的意思是在这里的某个地方进行一些递归调用。

无需为您的返回值命名(在您的情况下为listdoor)。 如果函数定义很短,例如这样,则让定义本身成为返回值的“标签”。 在最后一个代码块中,该函数未为其返回的列表命名。

我想说的最大问题是, let x = value仅在顶层有意义。 在其他构造中,唯一可用的形式是let x = value in y 所以,你缺少in一部分。

通常我建议使用; 起初略有保留。 您必须将OCaml函数视为一个大表达式(带有值)。 它不像具有一系列动作(要做的事情)的程序语言。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM