0

私はOcamlの初心者です。通常の順序削減に関するコードを記述しようとしていますが、構文が混乱しています。以下は、エラーを特定するための切り捨てられたコードです。

type expr =
| Var of char
| Num of int
| Lambda of expr
| Apply of expr * expr

let rec substitute f id e = match f with
| Num(i) -> if id == i then e else f
| _ -> f

let rec beta_lor e = match e with
| Apply(Lambda(f), e2) -> substitute f 1 e2
| Apply(e1,e2) -> beta_lor e1
| Lambda e1 -> beta_lor e1
| _ -> None

.mliのファイルで、beta_lorのタイプは次のようになります。valbeta_lor:expr-> expr option

このファイルをコンパイルすると、beta_lorで使用した「None」の行に関するエラーが報告されます。エラー:この式にはタイプ'オプションがありますが、タイプexprの式が必要です。

ocamlコンパイラが型推論を行おうとしていることを理解し、オプションではなく式を出力することを期待していますが、beta_lorがオプションを出力する可能性があると主張しましたか?少し混乱しています。助けてください。

4

1 に答える 1

1

あなたの問題は、それが返さsubstitute れないexpr optionことです。を返すだけexprです。たぶん、あなたが望むのは、その場合beta_lorに戻ってくるSome (substitute f 1 e2)ことです。

編集

価値があるのは、あなたの説明は、オプションの型が主流言語のポインター型のようなものであり、興味深いポインターまたは NULL であるという考えに基づいているようです。Some exprNone. _ これら 2 つのケースを OCaml で明示的にラップおよびアンラップする必要があります。これは (これもまた、私の意見では) NULL を正当なポインター値として扱うよりもはるかに優れています。私たちは毎日、主流モデルのマイナス面を目の当たりにしています (編集して申し訳ありません)。

于 2013-02-18T17:24:17.957 に答える