我正在尝试编写一个返回给定数字下所有素数列表的过程.
例如:
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)
一系列小错误.
你的语法不正确.
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)类型签名
divOdd :: Int Int -> Bool
Run Code Online (Sandbox Code Playgroud)
无效.你可能意味着
divOdd :: Int -> Int -> Bool
Run Code Online (Sandbox Code Playgroud)x
属于类型Int
,(/) :: Fractional a => a -> a -> a
不能应用于它.你可能意味着num <= x `div` 2
或2 * 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)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现在可能有点困难,但显示了许多不同的策略.