ml数据类型(带原始函数)如何制作?

时间:2011-06-01 08:59:32

标签: sml smlnj ml

我有这个数据类型

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) ......?

1 个答案:

答案 0 :(得分: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做,你可以从上面的代码片段中推断出来。