0

数学計算プログラムの一部を書きました。プログラムのパーサーを完成させたので、ユーザーが数式を文字列として入力すると、次の型の対応するデータ構造を取得する方法が既にあります。

type expression =
| Term of int
| Addition of expression * expression
| Multiplication of expression * expression
| Subtraction of expression * expression

今必要なのは、この種のデータ構造を評価する方法だけです。

  • (a) 数学ステートメント「3*((1 + 4)- 5)」に対応する式を書きます</li>
  • (b) Ocaml データ型を拡張して階乗コンストラクタを含め、「3*((1 + 4)! -5)」などの式を処理できるようにする</li>
  • (c) 数式を取り、その (整数) 値を返す Ocaml 関数 eval を書きます。たとえば、(a) の式の結果として 0 を返す必要があります。
 # let rec eval expr = ...
 val eval : expression -> int = <fun>

新しい階乗コンストラクターを支援する階乗 Ocaml 関数を書きたいと思うかもしれません。

私はパートAについて混乱しています。ということlet expression = 3*((1 + 4)- 5);ですか?

パート b については、パターンに従う必要があります|Factorial of expression * expressionか?

4

2 に答える 2

4

a) が意味することは、提供された datatype の値として数式を記述できるようになったことですexpression。たとえば、コンストラクターAdditionは、加算演算子 (通常は (+) として記述) が 2 つの小さい式をオペランドとして取ることによって式を形成することを表現します。したがって、たとえば、数式 2 + 3 は Caml の値で表すことができます。

Addition (Term 2,Term 3)

expressionここで、階乗演算子が 2 つの引数ではなく 1 つの引数を取ることを観察すると、b) で求められているように、階乗のコンストラクターを使用してデータ型を拡張できるはずです。

最後に、c) では、この種の式の型の評価関数を書くのは簡単です: 定数は、それらが運ぶ整数値にマップするだけで、加算を評価するには、加算のオペランドを再帰的に評価してからそれらを加算する必要があります。

let rec eval = function
  | Term n -> n
  | Addition (l,r) -> eval e1 + eval e2
  | ...

残りのケース (b) に追加する階乗のコンストラクターを含む残りのコンストラクターの場合) は類似しており、自分でそれを行うことができるはずです。

幸運を!

于 2012-08-15T22:54:08.123 に答える
0

パート b: 質問の要点は、乗算は 2 つの数値を入力として取りますが、階乗は入力として 1 つの数値しか取りません。

于 2012-08-15T22:34:38.200 に答える