在Haskell中更新列表的元组元素

5
我正在使用Haskell编写一个程序,其中有一个由我定义类型组成的列表实例:
type Locals = [(String, Float)]

我正在试图通过接收一个字符串并更新相应的浮点值来更新这个列表,但是该字符串可能在此时不在列表中。

由于Haskell列表是不可变的,所以我决定最简单的方法是这样做(伪代码):

if a tuple containing the string exists:
    delete it

add the correct data

我想知道:

a)是否有更简单的方法来完成这个任务

b)如果没有,我应该如何删除正确的元素

谢谢

4个回答

5

这看起来像是一个关联映射。我会使用Data.Map。在其他语言中,这被称为“字典”。Map.insert可以满足你的需求。


在关联列表的位置使用 Data.Map 并不总是一个好主意。Data.Map 仅在数据结构较大时才更快,而且通常关联列表更简单易用,代码更清晰。由于我们没有关于关联列表如何使用或数据长什么样的信息,因此很难下定论。 - Yitz
@Yitz,我猜我对于关联列表更加简单和干净的说法提出挑战,“通常”情况下。我从未有过这样的经历。 - luqui
这可能是因为你过于频繁地使用 Data.Map 。 :) - Yitz
Data.List.lookup + update (key, value) list = (key, value) : list 这个很 简单。虽然不可扩展,但很容易。 - ephemient
2
@Yitz,或许你不太常用Data.Map模块!:-P - luqui

3
似乎最好的方法是这样做:
filter (\x -> fst x /= s) xs

不需要再帮忙了,谢谢。


1
这将删除 x所有 条目(这可能正是您想要的)。如果您只想删除一个(或知道只有一个匹配项),那么只需使用 Data.List.deleteBy:deleteBy ((== s) . fst) xs。如果您使用此功能,我猜您会使用 Data.List 中的其他函数,例如 lookup 和可能 insert - Thomas M. DuBuisson

1

addToAL 函数来自于 Data.List.Utils,可以实现你想要的功能。

将指定的 (key, value) 对添加到给定的列表中,并删除任何已经存在相同 key 的键值对。


0

我是Haskell的新手。只是为了好玩。

func xs str value = (str, value) : foldr step [] xs where
        step x acc
            | fst x == str = acc
            | otherwise = x:acc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接