2011-05-02 143 views
0

可能重複:
Update a list of a list of elements in a single list?更新列表中的元素列表?

我有值的列表,如下圖所示:

[ ["Off","Off","Off"], 
    ["Off","Off","Off"], 
    ["Off","Off","Off"] ] 

,並想返回以下內容:

[ ["Off","Off","Off"], 
    ["Off",*"On"*,"Off"], 
    ["Off","Off","Off"] ] 

我有以下的功能,通過自身的工作只是一個單獨的列表:

replaceAll 0 newValue (x:xs) = newValue:xs 
replaceAll b newValue (x:xs) = x:replaceAll (b-1) newValue xs 

但是,我似乎遇到了問題與列表中的這些多個列表的工作。我如何設計一個函數來處理這兩個列表(即另一個列表中的列表)?

還試圖讓我的頭在整個(x:xs)的東西。

+0

不是,我不相信我問了正確的問題,對不起。 – maclunian 2011-05-02 18:48:41

+0

正常的做法是編輯您的原始問題(可能是底部發布更新和改進),而不是發佈新問題。 – rampion 2011-05-02 19:46:22

回答

3

列表不是這種事情的最佳結構。但是讓我們繼續處理列表。

我們將調整您的replaceAll,以便替代您提供的替換值,您提供了一個函數,指定如何用新的替換舊的替換值。

replaceAll 0 f (x:xs) = f x:xs -- Here's where we transform x using f 
replaceAll b f (x:xs) = x:replaceAll (b-1) f xs 

現在我們可以使用replaceAll本身對矩陣的特定行執行我們想要的更換:

test = replaceAll 1 (replaceAll 1 (const "On")) yourList 

const "On"功能使用,因爲當我們到我們的具體元素,我們沒有更想改變它,我們只是想用"On"來代替它。爲每個單獨的行我們想要轉換它。

+0

如果您有更好的建議,我會全力以赴! – maclunian 2011-05-02 18:50:58

+0

@maclunian注意當你改變一行的中間時,你必須重建整個列表到元素的左邊。有些結構不需要你重建這麼多東西。但是,你需要什麼取決於你正在解決什麼問題。也許你想要一個IntMap? http://hackage.haskell.org/packages/archive/containers/0.1.0.1/doc/html/Data-IntMap.html – sigfpe 2011-05-02 20:17:20