我是一个绝对的初学者,我正在为课程编写一些代码,我遇到了这样一个问题:
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);;
为什么我在这里遇到语法错误?
答案 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的运营商。它是模式语法的一部分。由于我们不知道你要做什么,所以很难说更多。 也许你想用“||”这是一个布尔运算符。或许你正试图用一种不可能的模式做点什么。