代码之家  ›  专栏  ›  技术社区  ›  em70

F和O比

  •  4
  • em70  · 技术社区  · 15 年前

    我最近试图用F微软Sover基础服务写一些东西,当我这么做的时候,我碰到了一个问题:我必须表达一个(术语和术语)条件,在C语言中,条件可以简单地表达为T1和GT;T2,并且返回另一个术语对象。相反,在f中,我不得不将term.op_称为greater,以便获得与使用t1>t2相同的结果,从而产生bool而不是term。
    现在我想知道为什么F只选择比它产生布尔值更大的操作? F对T1>T2的解释有什么意义,而术语不实现IComparable?
    请记住,我理解为什么要在结构比较概念的基础上,用平等和整个平等来做这样的事情,我只是不知道如何将其扩展到“大于”/“小于”比较。

    3 回复  |  直到 15 年前
        1
  •  4
  •   Jonathan Allen    15 年前

    课本答案:

    运算符重载不是公共语言规范的一部分,这意味着编译器编写者可以随意忽略或仅在他们认为需要时部分支持它。作为一名图书馆作家,你有责任为人们提供与班级合作的其他方式。

    务实的回答:

    因为一开始做这件事是愚蠢的。为进行比较,显式创建了op greaterthan方法。你不应该用它来做“有趣”的事情,比如把两个术语具体化。CLR只允许您滥用它,因为它需要支持像C++这样的传统语言。

    顺便说一句,把两件事结合在一起会有一种超负荷的情况。它被称为op_concatenate。你真的应该考虑使用它而不是更大。

    编辑

    几乎很好的答案:

    在f中,我提到的concatation操作符是^。

    我称之为几乎好的答案,因为我不太确定C是否支持它。我认为只有在vb和f中才允许使用。

    编辑第2页

    似乎F并不是为了纪念^过载。

    编辑第3页

    世界跆拳道在这里进行吗?F根本不尊重>操作员。当然,您可以重载它,它会正确地发出比方法更大的操作,但它忽略了它。它甚至不尝试使用op greaterthan,而是查找System.IComparable接口。

    更糟糕的是,这是一个运行时检查。尽管它可以静态地确定类foo不实现IComparable,但它仍然继续进行并无论如何编译代码。

        2
  •  2
  •   Dario    15 年前

    直观地说,比较运算符 > 应始终生成布尔值!

    你可以回答这个问题 a > b 是或否,但不包括 3 new Stopwatch() .

    当它可以返回任何其他东西时,比如

    if a < b then
    

    再也没有意义了。

    对象(元组、列表等)通常实现 IComparable IStructuralComparable 例如,它可以对元组进行字典排序。

    *注意事项:

    imho,这不是可以比较的最佳解决方案 任何 对象,然后在运行时引发异常。Haskell使用typeclasses更好地解决了这个问题。

    greater :: (Ord a) => a -> a -> Bool
    greater a b = a < b
    

    比较不可编译的类型将在编译时失败。

        3
  •  0
  •   Nathan Brixius    15 年前

    您不必使用<和>运算符。求解器基础服务模型类有更大和更少的方法,您应该能够使用这些方法。