【问题标题】:programming haskell code: List of primes编程haskell代码:素数列表
【发布时间】:2016-05-08 18:57:25
【问题描述】:

我的任务是创建一个素数列表,但仅包含以下信息:

-列表必须是无限的
-我必须检查n > 1的素数
-如果有一个变量2 <= k < n-2,它除以n,那么它不是素数,如果它不除n,它是
-没有功能!

于是我开始写这样的代码:

primes = [n| n<-[2,3..],k<-[2,3..], if (k>=2) && (k<=(n-2))
            then if n `mod` k /= 0 then n else return ()
            else return ()  ]

但随后出现以下错误:“无法将预期类型'Bool'与实际类型匹配”

这是因为return (),但我不知道如何替换这个return

希望得到帮助。

【问题讨论】:

    标签: haskell list-comprehension primes


    【解决方案1】:

    假设你有一个函数:

    isPrime :: Int -> Bool
    

    对于素数返回 True,否则返回 False。然后你可以定义:

    primes = [ n | n <- [2..], isPrime n ]
    

    使用函数all,你可以这样写isPrime

    isPrime n = all (\a -> mod n a /= 0) [2..n-1]
    

    如果应用于xs 的每个成员的f 为True,则all f xs 返回True。所以n 是质数,如果对于 [2..n-1] 中的所有元素,mod n a /= 0,即 a 不整除 n。

    all 函数的更多示例:

    all even [2,4,10,12]       -- True
    all (\x -> x > 0) [4,-5,6] -- False
    all (\xs -> length xs > 0) [ [3], [4,5], [-4] ] -- True
    all (\x -> x*x < 0) []     -- True
    

    您可以通过使用标准模板对列表进行递归来自己定义all

    all f []     =  ...
    all f (x:xs) =  ...
    

    【讨论】:

    • 谢谢你的帮助,非常感谢!!
    【解决方案2】:

    它应该是 2 n-2,否则 4 将是素数(带有 )。

    没有函数,可以写成

    [n | n<-[2..], []<-[[i | i<-[2..div n 2], rem n i==0]]]            -- or, even,
    [n | n<-[2..], []<-[[j | i<-[2..n-2], j<-[i*i, i*i+i..n], j==n]]]  -- no `i` dividing `n`
    

    最后一个代码 sn-p 既是一个试验部门,又是一个仅通过加法工作的 Eratosthenes 筛子(当通过重新排列和共享重复计算发现和消除计算冗余时成为真正的筛子)。

    p>

    对于您的问题,return 不合适。列表推导式中的测试表达式只是 Bool 类型的表达式。 False 结果表示拒绝当前生成的值; True 表示接受 - 因此包含在结果列表中。

    另一件事是,重复生成值的重复失败测试意味着无限循环,当对于n-2 以上的所有k 值(由k&lt;-[2..] 生成而没有结束)你的测试@987654329 @ 将总是失败(并导致下一个 k 被生成,下一个,下一个......)。

    我们不进行测试,而是完全停止 n-2 之后的生成,使用 [2..n-2],因此测试条件始终保持通过构造——如果它失败,k 的值根本就没有生成。

    【讨论】:

      猜你喜欢
      • 2017-10-02
      • 2018-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-04
      • 1970-01-01
      • 2011-08-30
      相关资源
      最近更新 更多