【问题标题】:How to find values from a list within a tuple within a list in Haskell?如何从 Haskell 列表中的元组中的列表中查找值?
【发布时间】:2021-06-24 02:07:12
【问题描述】:

一个数据库列表包含元组,每个元组包含一个唯一标识符字符串和与其关联的字符串列表,如下所示:

example = [("id1",["value1","value2","value3"]),
           ("id2",["value4","value5"]),
           ("id3",["value3","value6"])]

如您所见,一个字符串值可以出现多个标识符,就像 'value3' 的情况,它对应于 'id1' 和 'id3'。

我有兴趣编写一个函数,该函数将数据库和字符串值作为参数并返回这些字符串对应的所有 ID 的列表,如下所示:

lookScan :: database -> string -> [id]

所以lookScan example "value3"的结果应该是["id1", "id3"]

这几天我一直在摸不着头脑,每当我似乎即将破解这个问题时,我总是会遇到一堆令人困惑的错误。我知道这应该用两个守卫来完成,这使它成为一个递归解决方案,但内部逻辑让我无法理解。

到目前为止我所拥有的:

lookScan ((id, stringsList):allEntries) string
| -- code if equality
| -- code if no equality

一个特别难以捉摸的问题是如何获取 'stringsList' 的每个元素并将其与参数 'string' 进行比较,以便检查是否相等。

任何形式的帮助,即使是最细微的提示,都将不胜感激!谢谢大家! :)

【问题讨论】:

    标签: list haskell recursion functional-programming tuples


    【解决方案1】:

    您可以使用elem :: Eq a => a -> [a] -> Bool 来检查项目是否是列表的元素(甚至来自任何Foldable)

    因此您的函数如下所示:

    lookScan :: Eq v => [(k, [v])] -> v -> [k]
    lookScan [] _ = []
    lookScan ((id, ls): otherEntries) query
        | elem query ls = …
        | otherwise = …

    你需要在哪里填写s。不管query 是否是ls 的一个元素,您仍然需要使用递归来查看otherEntries 中的剩余条目。

    【讨论】:

    • 非常感谢您的解释,它为我澄清了很多!你回复的速度之快让我感到震惊。在过去的几天里,我一直在尝试解决递归问题,到目前为止我有:lookScan [] _ = [] lookScan ((id, ls): otherEntries) 查询 |元素查询 ls = id:[] |否则 =lookScan otherEntries 查询它工作得很好,除了查询的值出现在几个 ID 的情况下,就像我原来的问题中的“value3”一样。它只找到第一个 ID,但不继续处理任何其他 ID。你认为问题是什么?
    • 您需要递归,以防项目是一个元素,如果它是不是一个元素。
    猜你喜欢
    • 1970-01-01
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    • 2021-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多