Sml ml数据类型(带基元函数)如何制作?

Sml ml数据类型(带基元函数)如何制作?,sml,smlnj,ml,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

我有这个数据类型

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 X1、X2、X3、S X4、X5; addsub4,5,2,9,8返回它=12 4+5+2+9-8

p=+,S=-,M=*,D=/
不仅仅是X5,我还需要Xn…?

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

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;
例如:evl2p[Const 3,Const 2,M[Const 3,Const 2,Const 1]]将返回11

如果您仍然想使用S和D,可以从上面的代码片段推断