2011-05-02 104 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