function - 如何评估数据类型和 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”来表示“添加”?
解决方案
修复空白,数据类型定义和定义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
定义。
我不明白为什么我们需要在这里“否定”或“添加”
我也不知道。您在课程中遇到的问题完全是假设性的。
推荐阅读
- xml - XSLT:获取结果元素
- installation - “在尝试安装 Agda 2.6.1.2 时无法加载模块‘Control.Monad.Trans.Maybe’”
- python - 如何在 Python 中更新表方案,仅使用 Python(无 CLI)
- symfony - 学说不会为新实体产生迁移
- c# - 如何让 setup.exe 中的发布者知道 UAC 已经识别它?
- .net-core - Dotnet Core 3.1 应用程序不会从 Visual Studio Code 运行
- java - Spring Integration SSL Connection 上的“未找到受信任的证书”
- mqtt - mqtt 消息中客户端库的名称
- php - 没有模型的 Laravel Excel 3.1 样式
- python - 我可以将 exe 文件转换为 mac 的 .app 文件吗