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

发布于 2024-11-11 14:03:28 字数 670 浏览 5 评论 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)...?

i have this datatype

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

and this procedure

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));

how to expand this datatype and evl procedure to do:

-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 = /
and not just for X(5), I need for X(n)...?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

带刺的爱情 2024-11-18 14:03:28

关于您的数据类型和函数的一些注释:

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

Some notes about your datatype and function:

  • X is a redundant case, it has no
    meaning in context of arithmetic
    expression.
  • You overused lamda functions, it
    makes your code so hard to
    understand.

S (subtract) and D (divide) are not commutative, it is a bad idea to do those operations on a list of arguments. I demonstrate how to do so with P (Plus) and M (Multiply):

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;

For example: evl2 (P [Const 3, Const 2, M [Const 3, Const 2, Const 1]]) would return 11.

If you still want to do it with S and D, you can infer from the above code fragment.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文