我是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”?
答案 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
定义。
我不明白为什么我们在这里需要“取反”或“添加”
我也不知道。您在本课程中遇到的问题完全是假设的。