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,可以从上面的代码片段推断