如何在Haskell中实现[如果列表中的x为func(x,lst),则为x]?

Sad*_*nes 0 recursion haskell

好的,所以我来自python背景,是haskell的新手,正在做作业。我已经解决了问题本身,但是我的逻辑/代码看起来很丑陋,想知道改进它的方法。我想要做的是遍历一个列表,并以该列表作为参数来调用另一个函数。

假设我想在haskell中实现以下目标。

input = [1,2,2,3,3,4,5]
output = [1,4,5] #occurs Once
Run Code Online (Sandbox Code Playgroud)

所以我想从 x->y

通常我会怎么做

def checksOnce(input):
  lst = []
  for val in input:
    if occursOnce(val,input):
      lst.append(val)
  print(lst)
Run Code Online (Sandbox Code Playgroud)

我该如何在Haskell中进行迭代?我有一个函数可以很好地发生的事件,它需要一个值并列出并返回布尔值,就像python一样。

checksOnce :: [Int] -> [Int] -> [Int]
checksOnce [] lst = []
checksOnce (x:xs) lst
  | occursOnce x lst = [x] ++ checksOnce xs lst
  | otherwise = checksOnce xs lst
Run Code Online (Sandbox Code Playgroud)

和类似mainFunc lst = checksOnce lst lst的调用上面的函数。

上面的工作正常,就我的硬件而言已经足够了,但是传递相同的参数一次是多余的!如何从去checksOnce :: [Int] -> [Int] -> [Int]checksOnce :: [Int] -> [Int]和仅使用一个列表遍历像上面的Python代码,而不是通过同一名单一旦确定功能的?

谢谢

Rei*_*chs 6

Haskell具有列表理解功能,因此您可以执行以下操作:

\f xs -> [x | x <- xs, f x xs]
Run Code Online (Sandbox Code Playgroud)

您也可以使用过滤器执行此操作:

\f xs -> filter (\x -> f x xs) xs
Run Code Online (Sandbox Code Playgroud)

  • @SadisticSardines`[x | x &lt;-lst,func x lst]`是Python的[[如果list中x的func(x,lst)为x]的直接翻译。`&lt;-`代替`for ... in`,并且条件写时没有`if`。 (2认同)