嘿伙计们,我希望能够替换元组列表中的元组。这就是我的想法:
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)]
先谢谢你的帮助。
答案 0 :(得分:9)
无法做到。 Haskell是一种纯函数式语言,所以一旦变量有了一个值,它就会保持这个值。
但是,您可以轻松地从旧的
计算新列表map (\ x -> if x == ("rob",7) then ("ain",3) else x) lst
答案 1 :(得分:0)
replaceTuple :: [(String, Int)] -> (String, Int) -> (String, Int) -> [(String, Int)]
replaceTuple tups old new = map check tups where
check tup | tup == old = new
| otherwise = tup
main = print $ replaceTuple [("john",3), ("greg",3), ("tom",2), ("rob",7), ("jason",4), ("tev",7)] ("tev", 7) ("newperson", 9001)
这将(从类型注释中可以看到)仅适用于(String,Int)列表,这就是你所拥有的。但是,您可以使用replace :: Eq b => [b] -> b -> b -> [b]
的类型签名定义更一般的替换函数。 b
必须是Eq
类型类的实例,因为我们正在比较元素,这就是“Eq b => ...”的含义。
答案 2 :(得分:0)
以下是可以做的事情:
import qualified Data.Map.Lazy as Map
lst = Map.fromList [("john",3), ("greg",3), ("tom",2), ("rob",7), ("jason",4), ("tev",7)]
lst2 = Map.insert "ain" 3 $ Map.delete "rob" lst
如果您正在使用受感染的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”所在地图中的“地点”相同。但是,地图没有像列表那样的排序概念。
答案 3 :(得分:0)
如果您想在列表中进行修改,我通常会发现最简单的方法是使用span
或break
或splitAt
打破列表,进行更改,然后粘贴它与++
一起返回。所以在这种情况下,我会这样做:
case break (\ (key,val) -> key == "rob") lst of
(_, []) -> error "key not found! :("
(xs, _ : ys) -> xs ++ ("ain", 3) : ys
请注意,如果您使用Data.Sequence,则会有一个函数update
,它可以完全按照您想要的方式运行,并且速度更快。