Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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_Tuples - Fatal编程技术网

List 替换元组列表中的元组-Haskell

List 替换元组列表中的元组-Haskell,list,haskell,tuples,List,Haskell,Tuples,嘿,伙计们,我希望能够替换元组列表中的元组。以下是我的想法: let lst = [("john",3), ("greg",3), ("tom",2), ("rob",7), ("jason",4), ("tev",7)] 我希望能够从列表中删除任何元组,比如(“rob”,7),然后用新元组(“ain”,3)替换它。 最后,我的最终列表如下所示: lst = [("john",3), ("greg",3), ("tom",2), ("ain",3), ("jason",4), ("tev",7

嘿,伙计们,我希望能够替换元组列表中的元组。以下是我的想法:

let lst = [("john",3), ("greg",3), ("tom",2), ("rob",7), ("jason",4), ("tev",7)]
我希望能够从列表中删除任何元组,比如(“rob”,7),然后用新元组(“ain”,3)替换它。 最后,我的最终列表如下所示:

lst = [("john",3), ("greg",3), ("tom",2), ("ain",3), ("jason",4), ("tev",7)]

提前谢谢你的帮助。

这是办不到的。Haskell是一种纯函数式语言,因此一旦变量有值,它就会永久保留该值

但是,您可以轻松地从旧列表计算新列表

map (\ x -> if x == ("rob",7) then ("ain",3) else x) lst

这是办不到的。Haskell是一种纯函数式语言,因此一旦变量有值,它就会永久保留该值

但是,您可以轻松地从旧列表计算新列表

map (\ x -> if x == ("rob",7) then ("ain",3) else x) lst
这将(正如您可以从类型注释中看到的)仅适用于(String,Int)列表,这就是您所拥有的。但是,您可以定义一个更通用的替换函数,其类型签名为
replace::Eq b=>[b]->b->b->[b]
b
必须是
Eq
类型类的实例,因为我们正在比较元素,这就是“Eq b=>…”的意思

这将(正如您可以从类型注释中看到的)仅适用于(String,Int)列表,这就是您所拥有的。但是,您可以定义一个更通用的替换函数,其类型签名为
replace::Eq b=>[b]->b->b->[b]
b
必须是
Eq
类型类的一个实例,因为我们正在比较元素,这就是“Eq b=>…”的意思。

下面是您可以做的:

如果使用Interprest Haskell,则过程基本相同:

Prelude> import qualified Data.Map.Lazy as Map
Prelude Data.Map.Lazy> let lst = Map.fromList [("john",3), ("greg",3), ("tom",2), ("rob",7),     ("jason",4), ("tev",7)]
Prelude Data.Map.Lazy> lst
fromList [("greg",3),("jason",4),("john",3),("rob",7),("tev",7),("tom",2)]
Prelude Data.Map.Lazy> let lst2 = Map.insert "ain" 3 $ Map.delete "rob" lst
Prelude Data.Map.Lazy> lst2
fromList [("ain",3),("greg",3),("jason",4),("john",3),("tev",7),("tom",2)]
请注意,“ain”不一定与“rob”在地图中的“位置”相同。但是,地图没有列表那样的排序概念。

以下是您可以做的:

如果使用Interprest Haskell,则过程基本相同:

Prelude> import qualified Data.Map.Lazy as Map
Prelude Data.Map.Lazy> let lst = Map.fromList [("john",3), ("greg",3), ("tom",2), ("rob",7),     ("jason",4), ("tev",7)]
Prelude Data.Map.Lazy> lst
fromList [("greg",3),("jason",4),("john",3),("rob",7),("tev",7),("tom",2)]
Prelude Data.Map.Lazy> let lst2 = Map.insert "ain" 3 $ Map.delete "rob" lst
Prelude Data.Map.Lazy> lst2
fromList [("ain",3),("greg",3),("jason",4),("john",3),("tev",7),("tom",2)]

请注意,“ain”不一定与“rob”在地图中的“位置”相同。然而,地图没有像列表那样的排序概念。

当你想在列表中进行编辑时,我通常发现最简单的方法是用
span
break
splitAt
将列表拆分,进行更改,然后用
++
将其粘合在一起。所以在这种情况下,我会:

case break (\ (key,val) -> key == "rob") lst of
  (_, []) -> error "key not found! :("
  (xs, _ : ys) -> xs ++ ("ain", 3) : ys

请注意,如果使用,则会有一个函数
update
,它可以准确地执行您想要的操作,而且速度更快。

当您要在列表中进行编辑时,我通常发现最简单的方法是使用
span
break
splitAt
将列表拆分,进行更改,然后用
++
将其粘在一起。所以在这种情况下,我会:

case break (\ (key,val) -> key == "rob") lst of
  (_, []) -> error "key not found! :("
  (xs, _ : ys) -> xs ++ ("ain", 3) : ys

请注意,如果您使用,则会有一个函数
update
,它可以准确地完成您想要的事情,而且速度更快。

说“它不可能完成”有点假,因为它是可以完成的,只是与用不纯正的语言完成的方式不同,而且可以使用类似的性能特征来完成(例如,请参阅:finger trees)虽然您当然不能使用内置列表类型。我所说的“无法完成”,是指Haskell没有变量重新分配(:=)。我认为finger trees不会改变这一点。(不过,感谢您提到它们——实际上我并不熟悉它们,它们看起来很有趣。)从某种意义上说,州议员确实赋予Haskell改变“可变”值的能力,但我怀疑OP还没有完全准备好。说“这不可能做到”有点虚伪,因为这是可以做到的,只是不像用不纯正的语言那样,而且可以用类似的性能特征做到(例如,请参阅:finger trees)虽然您当然不能使用内置列表类型。我所说的“无法完成”,是指Haskell没有变量重新分配(:=)。我认为finger trees不会改变这一点。(不过,感谢您提到它们——实际上我并不熟悉它们,它们看起来很有趣。)从某种意义上说,StateMonads确实赋予Haskell改变“变量”的能力值,但我怀疑OP还没有准备好。不同的容器类型可能比这些操作的列表更合适。例如,考虑或。不同的容器类型可能比这些操作的列表更合适。例如,考虑或。