首页 > 解决方案 > 如何评估数据类型和 true_of_all_constants 函数?

问题描述

我是 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,应该用什么替换 e?另外,你能解释一下 datatype 在这里做什么吗?我不明白为什么我们需要在这里“否定”或“添加”;为什么我们有“exp*exp”而不是“exp+exp”来表示“添加”?

标签: functionfunctional-programmingsmlhigher-order-functions

解决方案


修复空白,数据类型定义和定义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我称它为predicatep ,但这是一种品味。

试图评估他们,我总是得到错误

以下是一些表达式和评估它们的示例:

- 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

你能解释一下 datatype 在这里做什么吗?

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

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

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

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


推荐阅读