我有一个元素列表,我希望更新它们:
来自此:[“关闭”,“关闭”,“关闭”,“关闭”]
对此:[“关”、“关”、“开”、“关”]
由于我对 Haskell 有点陌生,我一直在使用 (x:xs)!!y
使用以下函数提取和更新各个组件:
replace y z [] = []
replace y z (x:xs)
| x==y = z:replace y z xs
| otherwise = x:replace y z xs
然后在 ghci 中输入以下内容:(replace "Off""On"["Off",'Off","Off","Off"]) !! 2
我得到以下信息:“On”
我似乎能够提取和转换列表的元素,但我似乎无法通过转换的单个元素获得列表。
任何有关此事的帮助将不胜感激。
最佳答案
通常,您可以通过拆分列表、替换元素并将其重新连接在一起来修改列表的元素。
要在索引处拆分列表,我们有:
splitAt :: Int -> [a] -> ([a], [a])
您可以使用它来分解列表,如下所示:
> splitAt 2 ["Off","Off","Off","Off"]
(["Off","Off"],["Off","Off"])
现在您只需弹出列表的 snd
组件的 head 元素即可。这可以通过模式匹配轻松完成:
> let (x,_:ys) = splitAt 2 ["Off","Off","Off","Off"]
> x
["Off","Off"]
> ys
["Off"]
您现在可以通过“打开”重新加入列表:
> x ++ "On" : ys
["Off","Off","On","Off"]
我将让您将这些部分组合成一个函数。
<小时/>作为风格注释,我建议使用新的自定义数据类型,而不是 String
进行切换:
data Toggle = On | Off deriving Show
关于list - 替换 Haskell 中的单个列表元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5852722/