(^) 的奇怪行为

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 以了解有关类型和数字的更多详细信息。