【问题标题】:ml datatype (with primitive functions) how to make?ml 数据类型(带有原始函数)如何制作?
【发布时间】:2012-02-22 21:12:54
【问题描述】:

我有这个数据类型

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

【问题讨论】:

    标签: sml smlnj ml


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-08
      • 2016-01-21
      • 2012-11-25
      • 2013-01-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多