奇怪的行为(^)

时间:2016-11-02 09:53:32

标签: haskell ghci

我正在开发一款解谜游戏,其中需要一个指数函数,所以我定义了

exp' :: Int -> Int -> Int
exp' = (^)

这里发生了奇怪的事情:

*Main> exp' 6 25
  

-8463200117489401856

但是

*Main> 6^25
  

28430288029929701376

我在exp' (^)ghci之间找不到任何区别。

ghc错误吗?

  

Glorious Glasgow Haskell编译系统,版本8.0.1

1 个答案:

答案 0 :(得分:14)

  

我找不到任何差异

是的,存在一些差异。

:t exp'
exp' :: Int -> Int -> Int

:t (^)
(^) :: (Num a, Integral b) => a -> b -> a

:t (^)
--                           Num    Integral    Num
(^) :: (Num a, Integral b) => a  ->     b    ->  a

请参阅?这是关于类型

简单地说,Int是有限的,因此当超出允许范围时它会溢出到负数:

> (6::Int) ^ (25::Int)
  

-8463200117489401856

虽然Integer无界限,但不会溢出:

> (6::Integer) ^ (25::Integer)
  

28430288029929701376

因此,要解决此问题,您只需将Int更改为Integer

exp' :: Integer -> Integer -> Integer
exp' = (^)

您可以访问https://www.haskell.org/tutorial/numbers.html了解有关类型和数字的详细信息。