【问题标题】: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,它没有出现在建议栏中。我发表的另一篇文章是关于字符串而不是泛型类型。

标签: list haskell element variable-assignment


【解决方案1】:

实际上,updateRow 函数的 otherwise 部分的想法与其他 questionreplace 中的想法相似。

想法是:如果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

    【讨论】:

    • 对我的联赛来说有点先进..
    • 它看起来更可怕:首先你用它的索引压缩所有东西,然后你把所有东西都“恢复正常”,除了给定的索引(你替换元素的地方)。
    • 谢谢,但是像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为您提供的功能。它适用于任何类型的列表,我认为它可以满足您的需求。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-09
        • 2018-05-27
        • 2021-05-19
        • 1970-01-01
        • 1970-01-01
        • 2021-12-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多