Haskell (^)的怪异行为
我正在做一个解谜游戏,其中需要一个指数函数,所以我定义了Haskell (^)的怪异行为,haskell,ghci,Haskell,Ghci,我正在做一个解谜游戏,其中需要一个指数函数,所以我定义了 exp' :: Int -> Int -> Int exp' = (^) 奇怪的事情发生了: *Main> exp' 6 25 -8463200117489401856 但是 284302880299929701376 我找不到我的exp'和(^)来自ghci的之间的任何差异 是一个ghcbug吗 光荣的格拉斯哥哈斯克尔编译系统,版本8.0.1 我找不到任何区别 是的,有一些不同 :t exp' exp' :: In
exp' :: Int -> Int -> Int
exp' = (^)
奇怪的事情发生了:
*Main> exp' 6 25
-8463200117489401856
但是
284302880299929701376
我找不到我的exp'
和(^)
来自ghci
的之间的任何差异
是一个ghc
bug吗
光荣的格拉斯哥哈斯克尔编译系统,版本8.0.1
我找不到任何区别
是的,有一些不同
: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)
284302880299929701376
所以,要修复它,只需将Int
更改为Integer
:
exp' :: Integer -> Integer -> Integer
exp' = (^)
您可能想访问以了解有关类型和数字的更多详细信息。对于还不了解类型类的新手来说,符号Num->Integral->Num
是一个非常混乱的来源。对于未指定的Num
类型,GHC默认为Integer
,这些类型不受分数的约束。这似乎是答案的一个重要部分。
exp' :: Integer -> Integer -> Integer
exp' = (^)