Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 在Haskell中更新列表的元组元素_List_Haskell - Fatal编程技术网

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

List 在Haskell中更新列表的元组元素,list,haskell,List,Haskell,我正在用Haskell编写的程序有一个定义类型的列表实例: type Locals = [(String, Float)] 我试图通过接收字符串并更新相应的浮点值来更新此列表,但该字符串当时可能不在列表中 由于Haskell列表是不可变的,所以我决定最简单的方法是这样做(使用伪代码): 我想知道: a) 如果有更简单的方法 b) 如果没有,我将如何删除正确的元素 谢谢看来最好的办法就是 filter (\x -> fst x /= s) xs 不需要更多的帮助,无论如何,谢谢。这看起来

我正在用Haskell编写的程序有一个定义类型的列表实例:

type Locals = [(String, Float)]
我试图通过接收字符串并更新相应的浮点值来更新此列表,但该字符串当时可能不在列表中

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

我想知道:

a) 如果有更简单的方法

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


谢谢

看来最好的办法就是

filter (\x -> fst x /= s) xs

不需要更多的帮助,无论如何,谢谢。

这看起来像一个关联地图。我会使用
Data.Map
。这在其他语言中被称为“词典”<代码>地图。插入你需要的。

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

func xs str value = (str, value) : foldr step [] xs where
        step x acc
            | fst x == str = acc
            | otherwise = x:acc
addToAL
from做你想做的事

将指定的(键、值)对添加到给定列表中,删除已存在相同键的任何现有对


使用
Data.Map
代替关联列表并不总是一个好主意
Data.Map
对于大型数据结构来说速度更快,而且关联列表通常使用起来更简单,代码也更干净。在这里,我们没有关于关联列表是如何使用的或数据是什么样子的信息,因此很难说。@Yitz,我想我质疑你关于关联列表“经常”更简单、更干净的说法。我从未经历过。那一定是因为你太频繁地接触
数据.Map
。)<代码>数据.列表.查找+
更新(键,值)列表=(键,值):列表
很容易。不可扩展,但很简单。@Yitz,或者您没有够到
数据。映射
的次数太多了!:-p这将删除
x
的所有条目(这可能正是您想要的)。如果只想删除一个(或者知道只有一个匹配项),那么只需使用Data.List.deleteBy:
deleteBy(==s.fst)xs
。如果你用这个,我猜你会用到Data.List中的其他函数,比如和maybe。
func xs str value = (str, value) : foldr step [] xs where
        step x acc
            | fst x == str = acc
            | otherwise = x:acc