首页 文章

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

提问于
浏览
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);;

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

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)
    

    等等 ...

  • 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程序,很多算法都会失败,因为它们通常需要特殊的语言功能,这些功能无法轻易翻译 .

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

  • 1

    它是OCaml中的操作员.2656148_ . 它's part of the pattern syntax. Since we don'知道你很难说的更多 . 也许你想使用"||"这是一个布尔运算符 . 或者也许你不可能're trying to do something with a pattern that' .

相关问题