2

私は初心者であり、使用した用語は正確ではない可能性があります。

私は持っている

type t = True | False | If of t * t * t | Int of int | Plus of t * t | GT of t * t

let isval t =
  match t with
      True|False -> true
    | Int _ -> true
    | _ -> false

eval 関数を実装したい。

let rec step t =
   match isval t with
      true -> raise NormalForm
    | false -> match t with
          If(t1, t2, t3) when t1=True -> t2
        | If(t1, t2, t3) when t1=False -> t3
        | Plus(t1, t2) -> t1+t2
        | GT(t1, t2) ->  t1>t2
        | _ -> raise NormalForm;;

Plus(t1, t2) -> t1+t2で、「この式の型は t ですが、式の型が int である必要があります」というエラーが発生します。

何が問題ですか?どうすれば直せますか?

4

2 に答える 2

3

コンパイラが言うように、+演算子は int で動作します。しかし、それを type の部分式に適用していますt。型tは のようなものを表すことができるため、Plus(True, False)これらのケースを実際にどのように処理するかを決定する必要があります。

また、戻り値の型を決定する必要があります。あなたのケースの中には、戻ってくるものもあれば、戻ってくるものもあれば、戻ってくるものもあるようboolです。物事の外観から、すべての場合に戻りたいと思うかもしれません。もしそうなら、あなたはただの代わりに返すでしょう。tinttInt nn

(Basile Starynkevitch は、こ​​れらの問題に取り組むコードを書いています。最初に自分で考えてから、彼のコードを見てください :-)

于 2013-10-06T07:15:45.303 に答える