为什么F#中的幂运算符只适用于浮点数?

我从来没有见过一个语言有指数或幂运算符只接受浮点数字?

例如:

2 ** 2 throws一个错误类型’int’不支持任何操作符’Pow’

这个设计决定是否有正当理由?

最佳答案
(**)和下降是两个不同的东西。当你看到(**),你可以使用对数来思考数学公式。当你看到。,它只是一系列的乘法。我理解它可以是令人惊讶/混淆起初,因为大多数其他语言没有这样的差异(主要是因为整数常常隐式转换为浮点值)。即使在数学中,也有一点小差别:见Wikipedia entry,第一个定义仅适用于正整数指数。

因为他们是两个不同的(但相关的)事情,他们有不同的签名。这是 (**):

^a -> ( ^b ->  ^a) when  ^a : (static member Pow :  ^a *  ^b ->  ^a)

这里是pown:

^a -> (int ->  ^a)
when  ^a : (static member get_One : ->  ^a) and
      ^a : (static member ( * ) :  ^a *  ^a ->  ^a) and
      ^a : (static member ( / ) :  ^a *  ^a ->  ^a)

如果你创建自己的类型,你只需要有一个,(*)和(/)来使它与pown一起工作。库将为你做循环(它是优化的,它不是天真的O(n))。

如果你想在类型上使用(**)运算符作为非整数值,你必须写出完整的逻辑(和pown中的算法不一样)。

我认为这是一个很好的设计决定,以分离这两个概念。

转载注明原文:为什么F#中的幂运算符只适用于浮点数? - 代码日志