Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell (^)的怪异行为_Haskell_Ghci - Fatal编程技术网

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' = (^)