我正在开发一款解谜游戏,其中需要一个指数函数,所以我定义了
exp' :: Int -> Int -> Int
exp' = (^)
这里发生了奇怪的事情:
*Main> exp' 6 25
-8463200117489401856
但是
*Main> 6^25
28430288029929701376
我在exp'
(^)
和ghci
之间找不到任何区别。
是ghc
错误吗?
Glorious Glasgow Haskell编译系统,版本8.0.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了解有关类型和数字的详细信息。