list - 替换 Haskell 中的单个列表元素?

标签 list haskell state

我有一个元素列表,我希望更新它们:

来自此:[“关闭”,“关闭”,“关闭”,“关闭”]

对此:[“关”、“关”、“开”、“关”]

由于我对 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/

相关文章:

list - 如何将我的数据保存在列表中,以便在Flutter应用程序的整个生命周期中都可以使用?

java - Flink 原始和托管声明。何时使用它们?

c++ - 为什么添加新项目时 list.end() 没有改变?

将 argv[] 与允许元素列表进行比较

haskell - 如何在不使用-XUndecidableInstances的情况下解决功能依赖项的覆盖条件

json - 在 Haskell 中解析 RoseTree JSON

uml - 如何建模两个不同类的两个交互状态机?

python - 使列表与另一个列表 python 完全匹配

python - 调用statistics.mean()时消耗的列表

c - 如何为递归类型创建 Storable 实例?