0

我是 ocaml 绝对的初学者,我正在为课程编写一些代码,但我遇到了这样一行的问题:

datatype logicexpr = Var of string
                 | Neg of logicexpr
                 | And of logicexpr * logicexpr
                 | Or of logicexpr * logicexpr;
let rec distributeLeft(X, And(e,f)) = And(distributeLeft(X, e),distributeLeft(Y, f)) 
| Or(X, Y);;

为什么我在这里收到语法错误?

4

3 回答 3

4

函数distributeLeft定义为:

fun distributeLeft(X, And(e,f)) = And(distributeLeft(X,e),distributeLeft(X,f))
| distributeLeft(X, Y) = Or(X, Y);

可以在 OCaml 中翻译为:

let rec distibuteLeft = function
  | (X, And(e,f)) -> And(distributeLeft(X,e),distributeLeft(X,f))
  | (X, Y)        -> Or(X, Y)

等等 ...

于 2012-05-16T18:06:26.653 回答
2

没有办法真正说出您想要实现的目标,因为您的代码中与 OCaml 语法的相似之处只是微不足道的。我想你从某个地方得到了你正在呈现的代码,所以也许它有助于找出原始语言是什么,因为它显然不是 OCaml。

尽管我不知道您到底想做什么,但我仍然可以尝试提供一些一般性提示。

第一:不要在 OCaml 中的参数周围使用括号。它们不是必需的,也不习惯使用。

let rec fac n = if n < 0 then 1 else n * (fac (n-1))

是阶乘函数的一个非常常见的定义。如您所见,使用的参数 n 没有任何括号。

第二:您似乎正在尝试进行一些模式匹配。虽然我不知道你使用的是什么语言,但看起来是这样的,因为代码风格类似于 haskell 中的模式匹配。

OCaml 中的模式匹配需要使用该match ... with子句显式完成。这是使用您定义的数据的示例:

type logicexpr = Var of string
               | Neg of logicexpr
               | And of logicexpr * logicexpr
               | Or of logicexpr * logicexpr

let rec distributeLeft x y = 
  match y with
    And(e,f) -> And(distributeLeft(X,e),distributeLeft(X,f))
  | Or(e,f)  -> Or(distributeLeft(X,e),distributeLeft(Y,f))
(* ... *)

这只是正确语法的示例,所以不要使用它。您需要真正了解从某个地方获取的程序才能将其翻译成另一种语言。还要非常小心,如果你以 Haskell 程序为例,很多算法都会失败,因为它们通常需要特殊的语言特性,而这些特性不容易翻译。

所以首先弄清楚这个程序是如何工作的,然后了解语法,然后尝试翻译。如果您在执行此操作时卡在某个地方,请回来,也许有人能够更好地帮助您。

于 2012-05-16T16:43:47.953 回答
1

在如此少的背景下很难提供帮助(正如pad指出的那样)。但是,符号“|” 不是 OCaml 中的运算符。它是模式语法的一部分。由于我们不知道您要做什么,因此很难说更多。 也许您想使用“||” 这是一个布尔运算符。或者,也许你正试图用不可能的模式做一些事情。

于 2012-05-16T16:29:53.330 回答