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 は括弧なしで使用されています。

2 番目: パターン マッチングを実行しようとしているようです。コードスタイルがhaskellのパターンマッチングに似ているため、使用している言語はわかりませんが、このように見えます。

match ... withOCaml でのパターン マッチングは、句を使用して明示的に行う必要があります。定義したデータを使用した例を次に示します。

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

非常に少ないコンテキストでヘルプを提供するのは困難です (パッドが指摘しているように)。ただし、記号「|」は OCaml の演算子ではありません。これはパターン構文の一部です。あなたが何をしようとしているのかわからないので、これ以上言うのは難しいです. 「||」を使いたかったのかもしれません。これはブール演算子です。あるいは、不可能なパターンで何かをしようとしているのかもしれません。

于 2012-05-16T16:29:53.330 に答える