获得x以下的素数

Sir*_*ack 3 primes haskell

我正在尝试编写一个返回给定数字下所有素数列表的过程.

例如:

Prelude>primes 8  
[2,3,5,7]  
Run Code Online (Sandbox Code Playgroud)

当我尝试加载文件时,Parse error in pattern Failed, modules loaded: none.如果有人能指出我正确的方向,我将不胜感激.

primes :: Int -> [Int]
primes x < 2 = []
primes x | isPrime x == True = primes (x - 1) ++ x
         | otherwise = primes (x - 1)

isPrime :: Int -> Bool
isPrime x | x < 2 = False
          | x == 2 || x == 3 = True
          | divEven x == True = False
          | divOdd x 3 == True = False
          | otherwise = True

divEven :: Int -> Bool
divEven x | mod x 2 == 0 = True
          | otherwise = False

divOdd :: Int Int -> Bool
divOdd x num | mod x num == 0 == True
             | num <= x/2 = divOdd x (num + 2)
             | otherwise = False
Run Code Online (Sandbox Code Playgroud)

eph*_*ent 7

一系列小错误.

  1. 你的语法不正确.

    primes x < 2 = []
    
    Run Code Online (Sandbox Code Playgroud)

    可能你的意思

    primes x | x < 2 = []
    
    Run Code Online (Sandbox Code Playgroud)

    同样,你写的地方

    divOdd x num | mod x num == 0 == True
    
    Run Code Online (Sandbox Code Playgroud)

    你可能意味着

    divOdd x num | mod x num == 0 = True
    
    Run Code Online (Sandbox Code Playgroud)
  2. 类型签名

    divOdd :: Int Int -> Bool
    
    Run Code Online (Sandbox Code Playgroud)

    无效.你可能意味着

    divOdd :: Int -> Int -> Bool
    
    Run Code Online (Sandbox Code Playgroud)
  3. x属于类型Int,(/) :: Fractional a => a -> a -> a不能应用于它.你可能意味着num <= x `div` 22 * num <= x.

    divOdd :: Int Int -> Bool
    divOdd x num | mod x num == 0 == True
                 | num <= x/2 = divOdd x (num + 2)
                 | otherwise = False
    
    Run Code Online (Sandbox Code Playgroud)
  4. x是类型Int,而不是[Int]. (++) :: [a] -> [a] -> [a]不适用于它.

    primes x | isPrime x == True = primes (x - 1) ++ x
    
    Run Code Online (Sandbox Code Playgroud)

    也许你的意思

    primes x | isPrime x == True = primes (x - 1) ++ [x]
    
    Run Code Online (Sandbox Code Playgroud)

最后,这是一种生成素数的效率很低的方法.你考虑过筛子吗? 素数 - HaskellWiki现在可能有点困难,但显示了许多不同的策略.