更新列表的第'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 中的ith 元素(如果有)替换为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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Haskell 和 Erlang 中的模式匹配

haskell 列表中的唯一元素

haskell中的Double for循环

比较列表haskell中的所有元素[重复]

Haskell中的Guards vs. if-then-else vs. case

获取列表中的列表元素