我想写一个函数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
但是在编译时,我得到“输入错误的解析错误”错误,但我找不到语法错误。有什么想法吗?
答案 0 :(得分:1)
您的问题在于使用acc = acc + x
。您只需将其写为acc + 1
或acc + 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