嵌套函数和变量的ocaml问题

时间:2018-05-15 00:19:43

标签: syntax-error ocaml

我试图使函数限制根据具有值[value]的列限制表的值。我的想法是为满足条件列和值参数的列创建一个由trues和falses组成的列表。稍后递归匹配将选择列,listmaker函数将根据真实的falses列表创建一个新列。

当涉及到存储在ocaml嵌套变量中时,让...在范围界定中我非常困惑。代码有什么问题?

{{1}}

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

在我看来,auxListMakerauxTrueFlser应该是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知道的终端上工作,它会强调它认为你有语法错误的地方。上面的原理图布局的前几行的语法显然是可以的。您必须显示您的代码(或显示问题的最小的自包含子集)以及您获得的特定错误消息。