2011-05-02 103 views
0

我有一些代碼,被設計在一個列表更新在單個列表元素的列表清單?

replaceNth n newVal (x:xs) 
| n == 0 = newVal:xs 
| otherwise = x:replaceNth (n-1) newVal xs 

例如,要更換一個值,當我加載將該函數GHCI,輸入並得到如下:

*Main> replaceNth 3 4 [3,3,3,3,3] 
[3,3,3,4,3] 

不過我我試圖在列表中使用這個函數來創建多個列表,而且似乎無法這樣做(例如)。

我想要的是得到這樣一個結果:

[[3,3,3,3,3],[3,3,3,**2**,3],[3,3,3,3,3]] 

從這[3,3,3,3,3],[3,3,3,3,3],[ 3,3,3,3,3]

使用類似上述的功能。

+0

類型此列表替換功能的是你原來的替換功能略有不同,因爲它現在替換元素2級深。 – 2011-05-02 17:59:56

回答

1

也許這你想要做什麼(適用於列表的列表):

replaceNth 1 (replaceNth 3 4 [3,3,3,3,3])

+0

親愛的主席先生,你的態度是好的,但你的代碼將無法編譯。 – 2011-05-02 18:27:50

+0

對於通用的東西來說太具體了。 – maclunian 2011-05-02 18:45:21

+0

@Jakob龍:我的「代碼」是一個功能 - 這樣就不會產生一個exe文件,如果你的意思是 - 但適用於列表的列表它產生列表的列表。 – phynfo 2011-05-02 18:59:57

3

你的功能無法滿足需求來處理你希望它瓶坯的任務。特別是,你需要知道的重置價值將是你調用函數。爲了得到這個工作,你可以:

  • 選擇第n個列表,計算新的列表,然後使用你的函數將替換放入列表中。 OR(更好)
  • 做,而不是採取一個新的價值,需要一個函數從舊值到新的更廣泛的功能:

replaceNth' :: Int -> (a -> a) -> [a] -> [a] 
replaceNth' n f (x:xs) 
    | n == 0 = (f x):xs 
    | otherwise = x:replace (n-1) f xs 

現在解決你的第二個問題:

let ls = [[3,3,3,3,3],[3,3,3,3,3],[3,3,3,3,3]] 
in replaceNth' 1 (replaceNth' 3 (const 2)) ls 

這是取代seco第二清單,通過利用該列表的第四個元素和更換它是什麼都與2

2

製作適用的功能列表的第n個元素,而不是一個功能做了一個列表。然後你可以很容易地得到你想要的東西,用它自己編寫,並使用const來替換內部。

0

使用您現有的定義:

ghci> let arg = [[3,3,3,3,3],[3,3,3,3,3],[3,3,3,3,3]] 
ghci> replaceNth 1 (replaceNth 3 2 (arg !! 1)) arg 
[[3,3,3,3,3],[3,3,3,2,3],[3,3,3,3,3]] 
ghci> 

重構它變成一個功能:

replaceMthNth m n v arg = replaceNth m (replaceNth n v (arg !! m)) arg 
+0

謝謝,但如果它可以映射到一個函數會很好。 – maclunian 2011-05-02 18:47:55

+0

@maclunian:很簡單。只需拿出你想要的功能來改變。 – rampion 2011-05-02 19:42:59