来自Java和C背景,掌握Ocaml的一些概念非常有趣。其中之一是,在for循环中运行/ multiple语句。
let test_method (x:vector list)(vec:vector) = if List.length x != 0 then {a=0.;b=0.} (* Return a vector of 0,0 *) else for i = 0 to List.length x do let key = {a=(List.nth x i).a;b=(List.nth x i).b} done;;
我得到的错误已经完成;;是一个意外的令牌。为什么会这样?即使我这样做也会发生这种情况
let test_method (x:vector list)(vec:vector) = if List.length x != 0 then {a=0.;b=0.} (* Return a vector of 0,0 *) else for i = 0 to List.length x do let key = {a=(List.nth x i).a;b=(List.nth x i).b} in let value = vec_neg key; done;;
其中vec_neg是一种正常工作的方法,可以否定向量类型。
非常感谢任何帮助。
答案 0 :(得分:3)
let
表达式必须有一个正文。 (即let var = val in body
)(除了让模块顶层的定义,隐式使用模块的其余部分作为正文)let
创建一个局部绑定,它位于正文范围内。如果你不使用它(即没有身体),这样做有什么意义?此外,语言中的每个表达式都必须评估为一个值。 let
表达式求值为body评估的任何值。这就是它需要一个身体的原因。
答案 1 :(得分:1)
在您撰写let foo = bar
之后,您必须先编写in
并再写一次“作业”。编译器期望in
但遇到done
,这是“意外”。
您应该删除let
或添加in
,具体取决于您的目标。