【发布时间】:2016-11-15 10:15:18
【问题描述】:
我有以下代码:
datatype eInt = infinity of int | 0 | Int of int;
exception undefined;
fun eAdd(e1:eInt, 0:eInt) = e1
| eAdd(0, e2) = e2
| eAdd(e1, infinity) = infinity
| eAdd(infinity, e1) = infinity
| eAdd(infinity, ~infinity) = raise undefined
| eAdd(~infinity, infinity) = raise undefined
| eAdd(e1, e2) = e1 + e2;
有一个新的数据类型允许三种类型:infinity、0 和 int。我认为 0 在这里可能是多余的,但我不确定。
我使用模式匹配来制定将两个 eInt 相加的不同类型的可能结果。
有四种不同的结果。
- 如果有0,返回其他int
- 如果有 ∞ ,则返回 ∞
- 如果存在 ∞ 和 -∞ ,则返回 undefined
- 还有什么,返回他们两个的加法
我能想到的唯一让这个算法更有效的事情是,如果我要删除双重情况,最后,在将 (e1, e2) 反转为 (e2, e1) 之后再次运行算法。
有什么想法可以提高效率吗?我将添加其他操作,例如除法,这将有更多的案例。
【问题讨论】:
标签: types pattern-matching sml