【问题标题】:Haskell: Replacing element with a given key in an association listHaskell:用关联列表中的给定键替换元素
【发布时间】:2009-04-27 15:04:58
【问题描述】:

我必须创建一个函数,它有一个键(String)、一个值(String)和一个键和值的关联列表([(String, String)])。该函数旨在将键/值对添加到列表的末尾,如果该键已经存在于列表中并具有关联的值,则删除旧值。

我尝试在键和关联列表上使用lookup,但我不确定如何处理输出-lookup 函数的输出类型是Maybe String,我不能似乎在上面做列表功能(如删除元素)。有什么方法可以查看列表并删除具有给定键的任何列表元素而不知道与之关联的值?

【问题讨论】:

    标签: list haskell


    【解决方案1】:

    您可能应该编写一个递归函数,将新的键/值对和现有列表作为参数,并循环遍历列表以生成插入新值的新列表。对于每个列表元素,您检查键是否与您要插入的键相同。如果不同,则保留旧元素,如果相同,则添加新元素而不是旧元素。如果您在没有找到密钥的情况下到达列表的末尾,您只需在末尾插入新项目即可。

    【讨论】:

      【解决方案2】:

      这是一个简单的函数,可以满足您的需求。它采用新的键值对并将其放在给定关联列表的前面,并过滤掉该键。

      addOrReplace :: Eq k => k -> v -> [(k, v)] -> [(k, v)]
      addOrReplace key value assoc = (key,value):(filter ((key /=).fst) assoc)
      

      函数fst定义为:

      fst (first,second) = first
      

      filter 接受谓词和列表,并返回仅包含满足谓词的元素的列表。

      编辑:按照 Tom 的建议,在 addOrReplace 的参数中拆分键值对。

      【讨论】:

      • 我更愿意将键和值作为单独的参数传递,而不是将它们配对。这样可以更轻松地部分应用该功能,而无需 curry 它。
      【解决方案3】:

      在 Haskell 中,我们经常使用 Maybe 数据类型,当我们不确定我们是否会得到一个值或什么都没有时。它相当于 Java 等更传统语言中的可为空类型。

      Maybe定义如下:

      data Maybe a = Nothing | Just a
      

      也就是说,该值可以是Nothing 或Just a,其中a 是您要查找的对象。例如,如果您正在使用lookup 函数搜索字符串"foo",并且您的列表中有一个("foo", "bar") 元组,您将得到Just "bar" 的结果。但是,如果您查找"xyzzy",您会得到Nothing。

      我们可以获取Maybe 值并使用maybe 函数将其转换为更有用的值(我知道名称令人困惑 - 该函数都是小写的)。定义如下:

      maybe default f (Just a) = f a
      maybe default f Nothing  = default
      

      第一个参数是默认值。如果我们有Nothing,这就是我们得到的。否则,我们将函数f 应用于a,其中a 是我们想要的。如果你只想返回a,你可以将id函数作为f传递:

      maybe default id (Just a) = id a
      

      有帮助,id a = a。

      如果您想继续使用当前的lookup 计划,您可以通过以下方式获得一些有用的东西。不过我个人更喜欢这种方法——在处理器上会更容易。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-16
        • 2021-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-29
        相关资源
        最近更新 更多