我试图使函数限制根据具有值[value]的列限制表的值。我的想法是为满足条件列和值参数的列创建一个由trues和falses组成的列表。稍后递归匹配将选择列,listmaker函数将根据真实的falses列表创建一个新列。
当涉及到存储在ocaml嵌套变量中时,让...在范围界定中我非常困惑。代码有什么问题?
{{1}}
答案 0 :(得分:3)
要意识到的主要是let
有两种用途。第一种形式用于定义模块中的值,并且必须出现在模块的最外层。它看起来像这样:
let name = expression
作为一种方便的语法,您可以在最外层定义一个函数,如下所示:
let name arg = expression
另一种形式的let
可以出现在任何地方,用于定义局部变量。它看起来像这样:
let name = expression1 in expression2
这将name
建立为具有expression1
给出的值的局部变量。名称的范围(可以使用的地方)是expression2
。
同样,作为一种方便的语法,您可以定义这样的本地函数:
let name arg = expression1 in expression2
在我看来,auxListMaker
和auxTrueFlser
应该是restrict
中定义的本地函数。并且trueFalseList
应该是本地(非功能)值。所以restrict
的形式是这样的:
let rec restrict (column, value, aTable) =
let auxTrueFalser (column, value, aTable) =
...
in
let auListMaker (vals, trueFalseList) =
...
in
let trueFalseList = auxTrueFalser (column, value, aTable) in
... (* body of restrict *)
在此布局中,restrict
在顶级定义(因此只有let
,没有in
)。其他名称是局部变量(值和函数),因此使用let ... in
定义。
另请注意,您必须在使用之前定义名称。在您的代码中,名称auxListMaker
在定义之前使用。在上面的布局中,顺序没问题。
<强>更新强>
进一步问题的答案。
第一种形式的let
(没有in
)的范围是模块的其余部分。对于简单的.ml源文件的常见情况,这意味着文件的其余部分。
是的,上面的原理图布局中显示的restrict
函数会在每次递归调用时重新评估trueFaleList
的值。
如果你在OCaml知道的终端上工作,它会强调它认为你有语法错误的地方。上面的原理图布局的前几行的语法显然是可以的。您必须显示您的代码(或显示问题的最小的自包含子集)以及您获得的特定错误消息。