【问题标题】:Haskell keys-values mapping assignmentHaskell 键值映射分配
【发布时间】:2014-05-18 12:12:01
【问题描述】:

我必须编写一个给定键列表的函数来查找所有值 与给定关联列表中的这些键相关联,其中一个键可以有多个关联值。因此,该函数必须连接各个键的查找结果。

这是我的lookupOne 代码:

lookupOne :: Int -> [(Int,a)] -> [a]
lookupOne x list = [values | (key,values)<-list, x==key]

现在我必须为lookupAll 编写代码,它将查找列表中的每个键并将其匹配到该对,然后附加结果。我必须遵循这个:

lookupAll :: [Int] -> [(Int,a)] -> [a]
lookupAll ... = 

所以我尝试了很多方法来做到这一点,但我无法弄清楚:如何提取键的一个元素(因为我的lookupOne 只需要一个Int 而不是[Int])每次看直到成对的(key,value)。我尝试使用 map 函数,但它不起作用,因为我不知道如何映射使用两个参数 (lookupOne) 的函数,因为 map 显然只将一个列表作为其参数。我也无法弄清楚如何对其进行模式匹配,因为显然xs 并不意味着在下一轮它只会再次提取[keys] 的一个元素你能帮我理解这个

【问题讨论】:

    标签: list haskell key concatenation key-value-store


    【解决方案1】:

    可能有更简洁和有效的方法来做到这一点,但坚持你原来的实现,你可以这样写:

    lookupAll :: [Int] -> [(Int,a)] -> [a]
    lookupAll xs list = [values | (key,values) <- list, key `elem` xs]
    

    【讨论】:

    • any (==key)也被称为elem key;)
    • 已更正,我不熟悉使用列表关联的函数,当我需要类似的东西时,我通常会选择containers。谢谢@CarstenSchultz
    • 一开始当然是对的,只是key `elem` xs读起来更好听。
    • 抱歉,打错了。现在明白了。
    【解决方案2】:

    你想用map,没问题。现在您已经意识到您需要一个只接受一个参数的函数,即键,但looupOne 需要两个参数。但是,list 参数对于每次调用都是相同的,因此我们可以执行以下操作。

    lookupAll :: [Int] -> [(Int,a)] -> [a]
    lookupAll xs list = ...
        where f x = lookupOne x list
    

    f 是您需要的那种功能。现在我们可以执行map f xs,但是结果将是一个列表列表。您可以在结果上使用concat,也可以查看concatMap 的定义以了解如何使用它。

    如果你喜欢列表推导,那么你也可以试试

    lookupAll xs list = [... | x <- xs, ... <- lookupOne x list, ... <- ...]
    

    我把它留给你(因为它看起来像家庭作业)来弄清楚其余的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多