【问题标题】:Walk through list using elements, but not losing elements Haskell使用元素遍历列表,但不会丢失元素 Haskell
【发布时间】: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。我知道这也用于结束递归调用/终止函数,但我需要在我的计数器函数中提供整个列表才能使其工作。我想简单地浏览一下列表并保持整个内容完好无损。这可能吗?

编辑:更新用例。我正在尝试检查一个列表是否是另一个列表的排列。我的思考过程是在每个列表中,如果它们是排列,则两个属性将保持:

  1. 它们将具有相同数量的总元素(稍后将实现此部分)

  2. 它们将具有相同数量的每个元素

现在我的计数器函数可以工作,但是当我递归地遍历 permut 函数时,我丢失了元素。我不关心效率,我不介意再次计算相同的元素并比较它,如果该数字多次出现在列表中。

【问题讨论】:

  • 你能给我们一个用例吗?你的描述对我来说太抽象了。
  • 只是将同一个列表传递给 2 个参数?并在递归期间保持第二个不变。
  • @Ingo 我已经提供了我正在尝试工作的具体用例
  • @KennyTM 无论如何都不是一个坏主意,但我很好奇在 Haskell 中是否有其他方法可以解决这个问题?
  • 啊,现在我明白了你所说的“失去元素”是什么意思。关键是您只检查左列表的第一个元素。您需要对左侧列表中的所有元素执行此操作。

标签: list haskell


【解决方案1】:

您的模式匹配有点过于详尽,您需要检查所有元素的条件。它应该看起来像:

permut [] ys = null ys
permut xs ys = all condition xs
  where
    condition x = ....

额外建议:当你发现自己在写作时是真的

if ..... then True else False

你写的太多了。

----- 附录:

所以你找到了all,它确实遍历列表(在我们的例子中是 xs),它会检查所有元素的条件是否为真(在我们的例子中是 xs)。例如:

all even [1,2,3]

是一种简短的说法:

even 1 && even 2 && even 3

所以,在你的 where 子句中,你有 condition,它可以访问原始的 xs 和 ys 列表,并为 xs 中的每个元素调用它。因此,您需要检查的只是condition 的参数 x 在 xs 和 ys 中出现的次数是否相同。为此,您已经有counter,所以它将是一个单行。

【讨论】:

  • 我想我仍然很困惑......我知道我将拥有完整的 xs 和 ys 列表来调用计数器,但是我如何才能“遍历”列表使用where 子句?旁注,你能解释一下 null 和 all 在你的函数中的用法吗?我从来没有见过它们
  • 我想我已经找到了 all 和 null 。有道理,但我的问题的核心仍然很普遍,它正在遍历列表。条件将获得整个列表 xs,我可以将整个列表 ys 传递给它,但是我怎样才能开始遍历列表。 Counter 需要一个元素,然后是整个列表。如果我写它 condition x = counter x ys 它将完全拥有两个列表而不仅仅是一个元素
  • 我添加了更多解释。
  • 很好的解释!我只是不明白如何利用所有的优势。成功了!
  • “当你发现自己在写作时……”我明白你在那里做了什么:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多