首页 > 解决方案 > 我如何在haskell中实现[x if func(x,lst) for x in list]?

问题描述

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

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

input = [1,2,2,3,3,4,5]
output = [1,4,5] #occurs Once

所以我想从x->y

通常我会怎么做

def checksOnce(input):
  lst = []
  for val in input:
    if occursOnce(val,input):
      lst.append(val)
  print(lst)

我如何在haskell中进行迭代?我有一个函数可以很好地用于发生事件,它接受一个值和列表并返回一个布尔值,就像 python 一样。

checksOnce :: [Int] -> [Int] -> [Int]
checksOnce [] lst = []
checksOnce (x:xs) lst
  | occursOnce x lst = [x] ++ checksOnce xs lst
  | otherwise = checksOnce xs lst

和类似mainFunc lst = checksOnce lst lst调用上述函数的东西。

以上工作正常,就我的硬件而言就足够了,但是传递相同的参数一次是多余的!我如何像上面的python代码那样只使用一个列表checksOnce :: [Int] -> [Int] -> [Int]checksOnce :: [Int] -> [Int]迭代而不是将同一个列表传递给函数?

谢谢

标签: haskellrecursion

解决方案


Haskell 有列表推导,所以你可以这样做:

\f xs -> [x | x <- xs, f x xs]

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

\f xs -> filter (\x -> f x xs) xs

推荐阅读