Haskell - 从列表中删除素数

时间:2014-12-03 08:32:51

标签: haskell syntax

我想写一个函数wp(没有素数),它从列表中删除所有素数 数字。因此,wp [1,2,3,4,5,6,7] = [1,4,6]。

我尝试这样编码:

wp :: [Int] -> [Int]
prime :: Int -> Bool

prime n = if f n > 0 then False else True
   where f n = foldl (\acc x -> if n `mod` x == 0 then acc = acc + 1 else acc = acc + 0) 0 [2..n-1]
wp xs = filter (not.prime) xs

但是在编译时,我得到“输入错误的解析错误”错误,但我找不到语法错误。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您的问题在于使用acc = acc + x。您只需将其写为acc + 1acc + 0(或仅acc)。另外,我建议在函数定义的顶部编写函数签名,而不是在顶部编写C风格的列表。

最后,我应该注意wp在结果中不会包含1,因此您必须手动包含它。

prime :: Int -> Bool
prime n = if f n > 0 then False else True
     where f n = foldl (\acc x -> if n `mod` x == 0 then acc + 1 else acc) 0 [2..n-1]

wp :: [Int] -> [Int]
wp xs = 1 : filter (not.prime) xs