2014-12-03 32 views
0

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

我试图编码它是这样的:

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

你的问题是在使用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