理解Haskell中的列表理解

Ste*_*fan 3 haskell

这是Euler项目任务#3的扰流板!如果你想自己解决,不要继续阅读.

我正在尝试通过为Project Euler编写程序来学习Haskell.目前我正在尝试解决任务#3,它要求数字600851475143的最大素数因子.

为此,我创建了一个liste包含所有数字的列表,这些数字是这个数字的除数(直到它的平方根).我现在的策略是,计算这些数字的除数,决定它们是否是素数.

number = 600851475143
-- sn = sqrt number
sn = 775146

liste = [x | x <- [1..sn],  (mod number x == 0)]
-- liste = [1,71,839,1471,6857,59569,104441,486847]

primelist :: Int -> [Int]
primelist z = [y | y <- [1..z], mod z y == 0] 

main = print [primelist x | x <- liste]
Run Code Online (Sandbox Code Playgroud)

应该出现在这里的结果应该是一个包含8个列表的列表,其中包含元素的除数liste.相反,列表

[[1],[1,3],[1,29],[1,3,29,87]]
Run Code Online (Sandbox Code Playgroud)

打印出来.

这个行为是如何解释的?

djf*_*djf 6

问题是类型声明primelist :: Int -> [Int].它强制Haskell使用本机整数,即32位平台上的32位整数.但是,如果你把它遗漏,Haskell会推断出函数类型Integer -> [Integer].整数允许以任意精度进行计算,但比本机类型慢一点.

引用Haskell常见问题解答中的"Integer和Int之间有什么区别":

Int上的操作可以比Integer上的操作快得多,但溢出和下溢可能会导致奇怪的错误.

现在不是真相.