【发布时间】:2013-10-01 14:48:44
【问题描述】:
我正在寻找一种遍历列表的方法,抓取一个元素(我想按照给定的顺序),将它与另一个函数一起使用,然后返回该列表并继续操作而不会从列表中丢失该元素.
在我看到的示例中,完成此操作的唯一方法是执行以下操作:
counter :: (Eq a1, Num a) => a1 -> [a1] -> a
counter a [] = 0
counter a [x] = if a == x then 1 else 0
counter a (x:xs) = if a == x then counter a xs + 1 else counter a xs
permut :: Eq a => [a] -> [a] -> Bool
permut [] [] = True
permut [x] [] = False
但是当在 permut 中再次调用时,这会从列表 xs 中删除元素 x。我知道这也用于结束递归调用/终止函数,但我需要在我的计数器函数中提供整个列表才能使其工作。我想简单地浏览一下列表并保持整个内容完好无损。这可能吗?
编辑:更新用例。我正在尝试检查一个列表是否是另一个列表的排列。我的思考过程是在每个列表中,如果它们是排列,则两个属性将保持:
它们将具有相同数量的总元素(稍后将实现此部分)
它们将具有相同数量的每个元素
现在我的计数器函数可以工作,但是当我递归地遍历 permut 函数时,我丢失了元素。我不关心效率,我不介意再次计算相同的元素并比较它,如果该数字多次出现在列表中。
【问题讨论】:
-
你能给我们一个用例吗?你的描述对我来说太抽象了。
-
只是将同一个列表传递给 2 个参数?并在递归期间保持第二个不变。
-
@Ingo 我已经提供了我正在尝试工作的具体用例
-
@KennyTM 无论如何都不是一个坏主意,但我很好奇在 Haskell 中是否有其他方法可以解决这个问题?
-
啊,现在我明白了你所说的“失去元素”是什么意思。关键是您只检查左列表的第一个元素。您需要对左侧列表中的所有元素执行此操作。