【问题标题】:Is there a more efficient way in processing an integer datatype?处理整数数据类型是否有更有效的方法?
【发布时间】: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


    【解决方案1】:
    1. 是的,0 是多余的,因为您还有 Int 0

    2. 使用大写的构造函数名称。

    3. 您还没有真正说出Infinity of int 的意思。从您的示例来看,您只对无穷大是正数还是负数感兴趣,因此 int 也是相当多余的。

    4. 不要使用异常,而是使用 option 类型。

    总之,你可能有

    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))
    

    如果您想要一个高效的实现,请考虑将您的整数编码为IEEE 754

    【讨论】:

    • 嗨,西蒙,我只是想说声谢谢。你帮了我很多,我真的很感激你在做什么。自从发布以来,我已经修改了我的答案。我已经完成了您所做的大部分更改,但还有一些更改。我将修改我的问题,以便其他人可以看到我现在拥有的内容。唯一不同的是,请问NONESOME在这种情况下是做什么的?
    • @AndrewRaleigh:关于 StackOverflow 的评论并不适合来回讨论。我建议您阅读诸如H&R 之类的介绍性书籍的相应部分。或者你可以谷歌搜索:herehere(最后一个资源似乎很好)。
    【解决方案2】:
    • 我删除了“递归”标签,因为此函数中没有递归。
    • 如果您特别担心效率,请从最频繁到最不频繁对子句进行排序。这可能意味着您的“未定义”子句将放在最后。
    • 检查选择子句的相对效率。花时间评估参数并切换一半的时间可能会消耗较短代码所节省的任何成本。

    【讨论】:

    • 谢谢,我添加了标签模式匹配,抱歉标签错误。将未定义向下移动是否意味着 eAdd(e1, e2) 将始终被评估?不过我会试试的。至于第三点,听起来是对的。感谢您的回答,我很感激:)
    • 哦。呃。是的,将默认子句保留在最后。哎呀! :-)
    猜你喜欢
    • 2016-05-20
    • 1970-01-01
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    相关资源
    最近更新 更多