常见的解析错误:"在"在调用其他函数OCaml的函数中

时间:2016-04-21 17:52:22

标签: list function multidimensional-array ocaml

这个Parse error: "in" expected after [binding] (in [expr]) 是我在Ocaml用户中搜索过的一个常见错误,但在我看到的例子中,我没有找到错误的答案,然后我将解释我的问题:< / p>

我宣布了这个功能:

let rec unit_propag xs  =

    let cuAux = teste xs 
    let updatelist = funfilter (List.hd(List.hd cuAux)) (xs) 
    let updatelist2 = filtraelem (negar(List.hd(List.hd cuAux))) (updatelist)

if(not(List.mem [] xs) && (teste xs <> []))
then 
    unit_propag updatelist2
;;

我在此代码中使用的函数之前已声明如下:

 let funfilter elem xs = List.filter (fun inner -> not (List.mem elem inner)) xs;;

let filtraele elem l = List.map( fun y -> List.filter (fun x -> x <> elem) y)l;;

let teste xs = List.filter(fun inner ->(is_single inner)inner)xs;;

let is_single xs = function
|[_]    -> true
|_  -> false
;;
let negar l =
match l with
V x -> N x
|N x    -> V x
|B  -> T
|T  -> B
;;  

但不是这个命令。 好吧,他们都在做我想做的事,但现在当我宣布unit_propag并试图编译时,我遇到了错误

let cuAux = teste xs

它说:

File "exc.ml", line 251, characters 20-22:
Parse error: "in" expected after [binding] (in [expr])
Error while running external preprocessor
Command line: camlp4o 'exc.ml' > /tmp/ocamlpp5a7c3d

然后我尝试在每个功能的末尾添加;,然后我的 &#34; in&#34; 错误出现在最后一个函数的行,就是这种情况unit_propag updatelist2

我做错了什么?人们通常会说这种错误发生在那段代码之前,但是当我评论这个函数时,程序编译得很完美。

我需要发布更多代码吗?或者我需要在我的问题中更清楚? 这可能在Ocaml中进行,还是我正在做一些我不能做的事情?

谢谢

1 个答案:

答案 0 :(得分:3)

错误消息显示您遗失in,因此通过添加;解决此问题似乎很奇怪: - )

无论如何,您在功能in中的所有let个关键字后都错过了关键字unit_propag

你应该这样写:

let rec unit_propag xs  =
    let cuAux = teste xs in
    let updatelist = funfilter (List.hd(List.hd cuAux)) (xs) in
    let updatelist2 =
        filtraelem (negar(List.hd(List.hd cuAux))) (updatelist)
    in
    if (not (List.mem [] xs) && (teste xs <> [])) then 
       unit_propag updatelist2

这里已经多次解释了基本问题(正如您所说)。基本上关键字let有两种用途。在外层,它定义模块中的值。在另一个定义中,它定义了一个局部变量,必须后跟in。这三个let位于unit_propag的定义范围内。

另一种解释let用法的尝试是:OCaml: Call function within another function