更新列表的第'x'个元素 - Haskell [重复]
Posted
技术标签:
【中文标题】更新列表的第\'x\'个元素 - Haskell [重复]【英文标题】:Update 'x'th element of list - Haskell [duplicate]更新列表的第'x'个元素 - Haskell [重复] 【发布时间】:2011-08-24 16:22:07 【问题描述】:可能重复:Replace individual list elements in Haskell?
我在这部分作业中取得了一些进展,但在下面附上了我所做的部分代码:
module Grid where
data State = On | Off deriving (Eq, Show)
next :: State -> State
next On = Off
next Off = On
type Row = [State]
updateRow :: Row -> Int -> Row
updateRow (r:rs) x
| x == 0 = next r:rs
-- | otherwise = ........????
如上面最后一行所示,我已经设法让 updateRow 在 x = 0 时工作,如下所示(第 0 个元素倒置)。
*Grid> updateRow [Off,Off,Off,Off] 0
[On,Off,Off,Off]
*Grid>
但是,当我尝试反转此列表中的其他元素时,这一切都没有解决。我似乎无法在此函数中“概括”公式。
我还必须遵循这个类型约定:
updateRow :: Row -> Int -> Row
提前致谢。
【问题讨论】:
尝试让 updateRow 递归?不清楚你想在这里做什么。 看看slice
函数
@abesto slice
功能不正常。
@aleator 基本上使 updateRow 递归可能是一种方法,但我愿意接受所有建议,前提是 updateRow 保留类型 updateRow :: Row -> Int -> Row
不,它不是@Don Stewart,它没有出现在建议栏中。我发表的另一篇文章是关于字符串而不是泛型类型。
【参考方案1】:
实际上,updateRow
函数的 otherwise
部分的想法与其他 question 的 replace
中的想法相似。
想法是:如果x
不为零,那么您想跳过元素r
(位于零位置)并在rs
的位置x - something
上调用updateRow
(其中something
考虑了您刚刚跳过的一个位置)。
希望对你有帮助
【讨论】:
【参考方案2】:一般的更新功能怎么样?
update i a as = map repl $ zip as [0..] where
repl (a',i') | i == i' = a
| otherwise = a'
我想还有更多性能更高的版本,但这个版本很容易理解,并且对于短名单来说已经足够好了。它将as
中的i
th 元素(如果有)替换为a
。
【讨论】:
对我的联赛来说有点先进.. 它看起来更可怕:首先你用它的索引压缩所有东西,然后你把所有东西都“恢复正常”,除了给定的索引(你替换元素的地方)。 Cataloged here 谢谢,但是像update i a as = let (start, _ : end) = splitAt (i-1) as in concat [start,[a],end]
这样的东西不是更有效率吗?【参考方案3】:
类似的东西:
module Grid where
data State = On | Off deriving (Eq, Show)
next :: State -> State
next On = Off
next Off = On
type Row = [State]
updateRow :: Row -> Int -> Row
updateRow (r:rs) x
| x == 0 = next r:rs
| otherwise = r : (updateRow rs (x-1))
updateRow [] x = []
【讨论】:
【参考方案4】:使用previous question you asked为您提供的功能。它适用于任何类型的列表,我认为它可以满足您的需求。
【讨论】:
以上是关于更新列表的第'x'个元素 - Haskell [重复]的主要内容,如果未能解决你的问题,请参考以下文章