Types 在处理整型数据类型时是否有更有效的方法?
我有以下代码:Types 在处理整型数据类型时是否有更有效的方法?,types,pattern-matching,sml,Types,Pattern Matching,Sml,我有以下代码: 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
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;
有一个新的数据类型,它允许三种类型:无穷大、0和int。我认为0在这里可能是多余的,但我不确定
我使用模式匹配来描述将两个EINT加在一起可能产生的不同类型的结果
有四种不同的结果
- 如果有0,则返回其他int
- 如果有∞ , 返回∞ 李>
- 如果有∞ 及-∞ , 返回未定义
- 如果还有其他问题,请返回其中两个的加法
我能想到的唯一一件事是,如果我删除双格,并在最后将(e1,e2)反转为(e2,e1)后再次运行该算法,那么该算法将更加有效 有没有办法提高效率?我将添加其他操作,例如除法,这将有更多的案例。
- 我删除了“recursion”标记,因为这个函数中没有递归
- 如果您特别担心效率,请将条款从最频繁到最不频繁排序。这可能意味着您的“未定义”子句将排在最后
- 检查选择子句的相对效率。有可能花一半的时间来计算参数和切换,会消耗更短代码所节省的任何时间
- 我删除了“recursion”标记,因为这个函数中没有递归
- 如果您特别担心效率,请将条款从最频繁到最不频繁排序。这可能意味着您的“未定义”子句将排在最后
- 检查选择子句的相对效率。有可能花一半的时间来计算参数和切换,会消耗更短代码所节省的任何时间
- 是的,
是多余的,因为您还有0
Int 0
- 使用大写的构造函数名称
- 你还没有真正说出你所说的int的无穷大是什么意思。从你的例子来看,你只关心无穷大是正的还是负的,所以int也是多余的
- 不要使用异常,而是使用选项类型 总之,您可能已经
datatype IntExt = PosInf
| NegInf
| Int of int
fun extAdd (PosInf, i2) = if i2 = NegInf then NONE else SOME PosInf
| extAdd (i1, PosInf) = if i1 = NegInf then NONE else SOME PosInf
| extAdd (NegInf, _) = SOME NegInf
| extAdd (_, NegInf) = SOME NegInf
| extAdd (Int a, Int b) = SOME (Int (a+b))
如果你想要一个高效的实现,考虑把你的整数编码为.< /p>
0
是多余的,因为您还有Int 0
datatype IntExt = PosInf
| NegInf
| Int of int
fun extAdd (PosInf, i2) = if i2 = NegInf then NONE else SOME PosInf
| extAdd (i1, PosInf) = if i1 = NegInf then NONE else SOME PosInf
| extAdd (NegInf, _) = SOME NegInf
| extAdd (_, NegInf) = SOME NegInf
| extAdd (Int a, Int b) = SOME (Int (a+b))
如果你想要一个高效的实现,考虑把你的整数编码为.< /p>谢谢,我添加了标签模式匹配,抱歉错误的标签。将未定义的向下移动是否意味着将始终计算
eAdd(e1,e2)
?不过我会试试的。至于第三点,听起来不错。谢谢你的回答,我很感激:)哦。嗯。是,将default子句保留到最后。哎呀!:-)谢谢,我添加了标签模式匹配,很抱歉标签错误。将未定义的向下移动是否意味着将始终计算eAdd(e1,e2)
?不过我会试试的。至于第三点,听起来不错。谢谢你的回答,我很感激:)哦。嗯。是,将default子句保留到最后。哎呀!:-)嗨,西蒙,我只是想说声谢谢。你帮了我很多忙,我真的很感激你所做的一切。自从发布后,我修改了我的答案。你做的大部分改动我都做了,只是还有一些改动。我将修改我的问题,以便其他人可以看到我现在的问题。唯一的区别是,我能问一下NONE
和SOME
在这种情况下做了什么吗?@AndrewRaleigh:StackOverflow的评论并不适合前后讨论。我建议你读一本介绍性书籍的适当部分,如。或者你可以在谷歌上搜索:,(最后一个资源似乎很好)。嗨,西蒙,我只是想说声谢谢。你帮了我很多忙,我真的很感激你所做的一切。自从发布后,我修改了我的答案。你做的大部分改动我都做了,只是还有一些改动。我将修改我的问题,以便其他人可以看到我现在的问题。唯一的区别是,我能问一下NONE
和SOME
在这种情况下做了什么吗?@AndrewRaleigh:StackOverflow的评论并不适合前后讨论。我建议你读一本介绍性书籍的适当部分,如。或者你可以在谷歌上搜索:,(最后一个资源似乎很好)。