0

私はこのデータ型を持っています

datatype e = X | Const of int | P of e*e | S of e*e | M of e*e | D of e*e;

そしてこの手順

val rec evl = fn (Const k)=>(fn x=>k)| X=> (fn x=>x)| P(e1,e2)=> (fn x=> (evl e1 x)+(evl e2 x))| S(e1,e2)=> (fn x=> (evl e1 x)-(evl e2 x))| M(e1,e2)=> (fn x=> (evl e1 x)*(evl e2 x))| D(e1,e2)=> (fn x=> (evl e1 x)/(evl e2 x));

このデータ型を展開する方法と evl 手順:

-val addsub = evl( A( X(1),X(2),X(3), S( X(4),X(5) ) )) ; addsub(4,5,2,9,8) return it = 12 (4+5+2+(9-8))

P = +、S = -、M = *、D = / X(5) だけでなく、X(n) も必要です...?

4

1 に答える 1

0

データ型と関数に関する注意事項:

  • X は冗長なケースであり、算術式のコンテキストでは意味がありません。
  • ラムダ関数を使いすぎているため、コードが理解しにくくなっています。

S (減算) と D (除算) は可換ではありません。引数のリストに対してこれらの操作を行うのは悪い考えです。P (プラス) と M (乗算) を使用してこれを行う方法を示します。

datatype e2 = Const of int | P of e2 list | M of e2 list;
val rec evl2 =
         fn Const k => k    
         | P es => List.foldl (fn (e, acc) => acc + (evl2 e)) 0 es
         | M es => List.foldl (fn (e, acc) => acc * (evl2 e)) 1 es;

例:evl2 (P [Const 3, Const 2, M [Const 3, Const 2, Const 1]])を返し11ます。

それでも S と D を使用したい場合は、上記のコード フラグメントから推測できます。

于 2011-06-01T15:06:12.067 に答える