将SML转换为OCaml(语法问题)

时间:2012-05-16 16:15:41

标签: ocaml sml

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

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);;

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

3 个答案:

答案 0 :(得分: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)

等等......

答案 1 :(得分: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程序为例,很多算法都会失败,因为它们通常需要特殊的语言功能,这些功能无法轻易翻译。

首先弄清楚,该程序如何工作,然后了解语法,然后尝试翻译。如果你在这样做的时候卡在某个地方,那就回来吧,也许有人能够更好地帮助你。

答案 2 :(得分:1)

很难给出如此少的背景帮助(就像垫指出的那样)。但是,符号“|”不是OCaml的运营商。它是模式语法的一部分。由于我们不知道你要做什么,所以很难说更多。 也许你想用“||”这是一个布尔运算符。或许你正试图用一种不可能的模式做点什么。