list - 如何表示一个无限列表要为 elem 检查升序?

标签 list haskell primes lazy-evaluation infinite

我有一个由以下列表理解初始化的无限素数列表:

primes = [x | x <- [2..], 0 `notElem` map (x `mod`) [2..(x `quot` 2)]]

这允许我进行类似 17 `elem` primes 的检查。确认 17 是素数。但是,当我检查列表中是否有非质数时,程序不会停止计算。我认为这是因为它没有意识到如果在大于该数字的素数之前在列表中找不到该数字,则在列表中的任何地方都找不到它。因此,Haskell 中是否有任何方式向编译器表明列表仅包含升序数字,以便 elem如果检查到达列表中大于其第一个参数的数字,它会知道停止并返回 false 吗?

最佳答案

一种可能性是使用 dropWhile :

isPrime n = (head $ dropWhile (< n) primes) == n

关于list - 如何表示一个无限列表要为 elem 检查升序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35556683/

相关文章:

java - 迭代器可以从列表中删除不等于特定值的项目吗?

javascript - 按增量按索引切片

haskell - Haskell 中的 fizzbuzz ?

python - Python 中的素数

javascript - 最大质因数函数运行速度太慢

python - 列表是否有简短的包含功能?

python - 如何将二十一点游戏的两个重复 for 循环转换为单个函数

haskell - 如何链接到本地​​ Haskell 库?

haskell - 为什么单子(monad)在组合下不关闭?

c++ - *1.0 在这段代码中做了什么?