如何评估数据类型和true_of_all_constants函数?

时间:2019-05-26 16:34:46

标签: function functional-programming sml higher-order-functions

我是sml的初学者,我正在Coursera学习编程语言课程。有一个我不知道如何评估的数据类型和函数:

datatype exp = constant of int
     | Negate of exp
     |Add of exp * exp
     |Multiply of exp * exp

fun true_of_all_constants(f,e) =
    case e of
    constant i => f i
      | Negate e1 => true_of_all_constants(f,e1)                
      | Add(e1,e2) => true_of_all_constants(f,e1)
              andalso true_of_all_constants(f,e2)
      | Multiply(e1,e2) => true_of_all_constants(f,e1)
              andalso true_of_all_constants(f,e2)

尝试评估它们,我总是会出错:

true_of_all_constants [3,4,5];
true_of_all_constants 4;
true_of_all_constants (is_even 4, 5);

其中is_even是一个小辅助函数:

fun is_even v =
(v mod 2 = 0)

要测试true_of_all_constants,应该用什么替换?另外,您能解释一下数据类型在做什么吗?我不明白为什么我们在这里需要“取反”或“添加”。为什么我们对“添加”使用“ exp * exp”而不是“ exp + exp”?

1 个答案:

答案 0 :(得分:1)

固定空白,数据类型定义和true_of_all_constants (p, e)的定义变为:

datatype exp =
    Constant of int
  | Negate of exp
  | Add of exp * exp
  | Multiply of exp * exp

fun true_of_all_constants (p, e) =
    let fun aux (Constant i)        = p i
          | aux (Negate e1)         = aux e1
          | aux (Add (e1, e2))      = aux e1 andalso aux e2
          | aux (Multiply (e1, e2)) = aux e1 andalso aux e2
    in aux e end

这里constant已重命名为Constant:两者都可以,但是用大写字母命名构造函数会在视觉上将其与其他标识符区分开。而且我使用了内部函数aux来缩短递归表达式。我不是用f来称谓{em> 的p,但这是有味道的。

  

尝试评估它们,我总是会出错

以下是一些表达式示例并对它们求值:

- val two_plus_two = Add (Constant 2, Constant 2);
- true_of_all_constants (fn i => i = 2, two_plus_two);
> val it = true : bool

- val two_times_neg_two = Multiply (Constant 2, Constant ~2);
- true_of_all_constants (fn i => i > 0, two_times_neg_two);
> val it = false : bool

- val two_four_six = Add (Constant 2, Add (Constant 4, Constant 6));
- fun is_even x = x mod 2 = 0;
- true_of_all_constants (is_even, two_four_six);
> val it = true : bool
  

您能解释一下数据类型在做什么吗?

我认为您应该在这里参考一本书或教程。

例如,ML for the Working Programmer, ch. 4(免费PDF)处理datatype定义。

  

我不明白为什么我们在这里需要“取反”或“添加”

我也不知道。您在本课程中遇到的问题完全是假设的。