如何正确使用haskell中的长度函数?

Posted

技术标签:

【中文标题】如何正确使用haskell中的长度函数?【英文标题】:How do I properly use the length function in haskell? 【发布时间】:2022-01-11 06:11:48 【问题描述】:

我目前正在努力尝试在 haskell 中查找范围之间的素数。程序正确打印出素数范围。例如 countPrimesUntil 2 10 将打印出 [2, 3, 5, 7]。我正在寻找数字 4,因为这是 2 到 10 之间的素数。如何正确合并 countPrimes?

import Data.List

countPrimesUntil :: Integral a=> a -> a -> [a]
countPrimesUntil a b = takeWhile (<= b) $ dropWhile (< a) $ sieve [2..]
    while sieve (n:ns) = n:sieve [m | m <- ns, m `mod` n /= 0]

countPrimes n = length([x | x <- [2..n], countPrimesUntil x])

【问题讨论】:

while 应该是where 【参考方案1】:

countPrimesUntil 命名错误;它不算什么。相反,它会生成一个介于 ab 之间的素数列表。

当给定参数2n 时,您只需将length 应用于countPrimesUntil 的结果。

countPrimes n = length (countPrimesUntil 2 n)
-- countPrimes = length . countPrimesUntil 2

【讨论】:

【参考方案2】:

在这种情况下,countPrimes 调用countPrimesUntil 2 n,并确定它的长度,所以:

countPrimes n = length (<strong>countPrimesUntil 2 n</strong>)

【讨论】:

以上是关于如何正确使用haskell中的长度函数?的主要内容,如果未能解决你的问题,请参考以下文章

Haskell 中的单子——洪峰老师讲创客道(三十五)

如何在纯函数中跳过不必要的 IO?

用sublime text 3编译haskell

FFI 可以处理数组吗?如果是这样,怎么做?

需要列表的原始长度作为 Haskell 中的“变量”,但它会随着递归而不断变化 [重复]

安全执行不受信任的 Haskell 代码