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

    • 使用大写的构造函数名称

    • 你还没有真正说出你所说的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>谢谢,我添加了标签模式匹配,抱歉错误的标签。将未定义的向下移动是否意味着将始终计算

      eAdd(e1,e2)
      ?不过我会试试的。至于第三点,听起来不错。谢谢你的回答,我很感激:)哦。嗯。是,将default子句保留到最后。哎呀!:-)谢谢,我添加了标签模式匹配,很抱歉标签错误。将未定义的向下移动是否意味着将始终计算
      eAdd(e1,e2)
      ?不过我会试试的。至于第三点,听起来不错。谢谢你的回答,我很感激:)哦。嗯。是,将default子句保留到最后。哎呀!:-)嗨,西蒙,我只是想说声谢谢。你帮了我很多忙,我真的很感激你所做的一切。自从发布后,我修改了我的答案。你做的大部分改动我都做了,只是还有一些改动。我将修改我的问题,以便其他人可以看到我现在的问题。唯一的区别是,我能问一下
      NONE
      SOME
      在这种情况下做了什么吗?@AndrewRaleigh:StackOverflow的评论并不适合前后讨论。我建议你读一本介绍性书籍的适当部分,如。或者你可以在谷歌上搜索:,(最后一个资源似乎很好)。嗨,西蒙,我只是想说声谢谢。你帮了我很多忙,我真的很感激你所做的一切。自从发布后,我修改了我的答案。你做的大部分改动我都做了,只是还有一些改动。我将修改我的问题,以便其他人可以看到我现在的问题。唯一的区别是,我能问一下
      NONE
      SOME
      在这种情况下做了什么吗?@AndrewRaleigh:StackOverflow的评论并不适合前后讨论。我建议你读一本介绍性书籍的适当部分,如。或者你可以在谷歌上搜索:,(最后一个资源似乎很好)。