(^) 的奇怪行为
Weird behavior of (^)
我正在开发一款需要指数函数的解谜游戏,所以我定义
exp' :: Int -> Int -> Int
exp' = (^)
这里发生了奇怪的事情:
*Main> exp' 6 25
-8463200117489401856
但是
*Main> 6^25
28430288029929701376
我找不到我的 exp'
和 ghci
的 (^)
之间的任何区别。
是 ghc
错误吗?
The Glorious Glasgow Haskell Compilation System, version 8.0.1
I couldn't find any difference
是的,有一些不同。
: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 以了解有关类型和数字的更多详细信息。
我正在开发一款需要指数函数的解谜游戏,所以我定义
exp' :: Int -> Int -> Int
exp' = (^)
这里发生了奇怪的事情:
*Main> exp' 6 25
-8463200117489401856
但是
*Main> 6^25
28430288029929701376
我找不到我的 exp'
和 ghci
的 (^)
之间的任何区别。
是 ghc
错误吗?
The Glorious Glasgow Haskell Compilation System, version 8.0.1
I couldn't find any difference
是的,有一些不同。
: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 以了解有关类型和数字的更多详细信息。