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) 返回它 = 12 (4+5+2+(9-8))

P = +, S = -, M = * , D = / 而不仅仅是 X(5),我需要 X(n) ...?

4

1 回答 1

0

关于您的数据类型和功能的一些说明:

  • X 是一个多余的情况,它在算术表达式的上下文中没有意义。
  • 您过度使用了 lamda 函数,这使您的代码难以理解。

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 回答