无限列表的函数,不包括三的倍数

时间:2016-01-14 10:56:29

标签: list haskell

此问题与我之前的问题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的倍数,则从自然数中删除元素。

如果你能帮助我找到正确的方向,我将非常感激。

2 个答案:

答案 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]

简单一点,尝试正确编写中间函数,检查数字是否为多个三元组。然后用它来清理你的清单。