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

下面是我的Haskell函数,用于从列表中删除
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)