Haskell 哈斯克尔模式故障?
下面是我的Haskell函数,用于从列表中删除Haskell 哈斯克尔模式故障?,haskell,mod,Haskell,Mod,下面是我的Haskell函数,用于从列表中删除2::Int和5::Int: remPrimesFactors25 :: [Int] -> [Int] remPrimesFactors25 [] = [] remPrimesFactors25 (x:xs) | x == 2 = remPrimesFactors25 xs | x == 5 = remPrimesFactors25 xs | otherwise
2::Int
和5::Int
:
remPrimesFactors25 :: [Int] -> [Int]
remPrimesFactors25 [] = []
remPrimesFactors25 (x:xs)
| x == 2 = remPrimesFactors25 xs
| x == 5 = remPrimesFactors25 xs
| otherwise = x : remPrimesFactors25 xs
这是我的问题。为什么会发生这种情况
λ> mod (10^22) (product (remPrimesFactors25 [2,5,23]) )
15
λ> mod (10^22) (product [23])
1
remPrimesFactors
始终返回Int
值列表,而不是Integer
值列表。由于mod
要求两个参数具有相同的类型,因此10^22
也被视为Int
,其精度不足以准确处理大的数字
Prelude> 10^22 :: Integer
10000000000000000000000
Prelude> 10^22 :: Int
1864712049423024128
您正在使用
Int
。使用固定数量的位,并且至少可以表示-229到229-1范围内的所有值。通常在32位机器上,它的取值范围为-231到231-1,在64位机器上,取值范围为-263到263-1<代码>10^22但是大于这些范围。这意味着Int
的10^22
将在64位机器上表示,例如1'864'712'049'423'024'128
如果使用可以表示任意大小的值的整数
,则不存在此类问题。如果因此将函数重写为:
remPrimesFactors25 :: [Integer] -> [Integer]
remPrimesFactors25 = filter (\x -> x != 2 && x != 5)
remPrimesFactors25::[Integer]->[Integer]
remPrimesFactors25=过滤器(\x->x!=2&&x!=5)
然后,10^22
将被解释为一个整数
,因此,10^22
将取10'000'000'000'000'000'000'000的值
但是,您不需要计算
10^22
。您可以使用类似的算法。欢迎使用StackOverflow。你的问题是什么?remPrimesFactors
返回一个Int
,而不是Integer
,因此迫使10^22
也被视为Int
,导致溢出……根本问题是Int
只能保证上升到~2^29
(GHC在64位系统上提供了类似于2^63
)的内容,这些内容都不足以容纳10^22>2^(3*22)=2^66
。您可能需要提到fromIntegral
可以用于修复代码。
remPrimesFactors25 :: [Integer] -> [Integer]
remPrimesFactors25 = filter (\x -> x != 2 && x != 5)