为什么在Haskell 0 ^ 0 == 1?

San*_*ois 2 haskell

为什么在Haskell 0 ^ 0 == 1?为什么不0 ^ 0 == 0?或者也许应该提出一些错误......

*Main> 0^0
1
*Main> 0**0
1.0
Run Code Online (Sandbox Code Playgroud)

谢谢你提前

GHCi,版本7.10.3

Sil*_*olo 9

当你看到签名时,它有点意义.

(^) :: (Num a, Integral b) => a -> b -> a
Run Code Online (Sandbox Code Playgroud)

这个设计用于非负整数指数.它可能是递归实现的,因此它的行为类似于重复乘法.因此,有意义的是"零功率的任何一个"是先例的规则,因为我们真的在谈论重复乘法.

(^^) :: (Fractional a, Integral b) => a -> b -> a
Run Code Online (Sandbox Code Playgroud)

这个很像前一个,除了它也适用于负指数,因为它的基数是小数.尽管如此,它的行为类似于重复乘法或重复除法(如果指数分别为正或负),那么再次重复这些操作中的任何一个零时应该产生1乘法同一性是有意义的.

(**) :: Floating a => a -> a -> a
Run Code Online (Sandbox Code Playgroud)

在Haskell中,浮点类型通常符合IEEE标准,IEEE特别定义pow(0.0, 0.0)1.0.因此,我想,Haskell只是符合标准,因此在这种情况下它与其他语言的行为一致.