此问题与我之前的问题Removing items from a list if a predicate holds有关。
我正在努力输出一个不包含三个任意倍数的无限列表。 为此,我现在有这几个功能:
delete :: Eq a => a -> [a] -> [a]
delete deleted xs = [ x | x <- xs, x /= deleted ]
removeif ::(a -> Bool)->[a]->[a]
removeif func [] = []
removeif func (h:t)= if func h then delete h (h:t) else removeif func t
nothreefolds :: [Integer]
nothreefolds = removeif (x `mod` 3 == 0) [1..]
但问题是我缺少一些语法知识,我想告诉removeif
如果它们是3的倍数,则从自然数中删除元素。
如果你能帮助我找到正确的方向,我将非常感激。
答案 0 :(得分:6)
removeif
想要函数作为第一个参数。但是x `mod` 3 == 0
不是一个功能。它是一个引用不存在的名称x
的表达式。
您想使用 lambda抽象:\x -> x `mod` 3 == 0
。
\x ->
部分表示这是一个名为x
的参数函数。
结果由以下表达式给出。
或者你可以简单地使用部分和功能组合:(== 0) . (`mod` 3)
。
答案 1 :(得分:3)
使用构图:
removeThreeMultiple = filter ( (/= 0) . (`mod` 3))
示例:
Prelude> removeThreeMultiple [1,2,3,4,9,0]
[1,2,4]
简单一点,尝试正确编写中间函数,检查数字是否为多个三元组。然后用它来清理你的清单。