更新列表元素,Haskell

时间:2010-05-15 01:54:05

标签: list haskell map

我有家庭作业我要使用一个函数更新列表,该函数接受两个元素并返回函数中给出的第一个元素的一部分的值。因此,需要通过遍历每个元素来更新整个列表,并通过对列表中的所有其他元素(包括其自身)应用该函数来更新其值。

到目前为止,我一直在尝试首先映射列表(以便每个元素都完成相同),然后通过再次映射指定元素的值来专门更新每个元素值,但是在尝试仅映射特定元素时value through:函数,特定元素和整个列表我一直抱怨我正在推断从'map function p @ list list'中得到的值列表,而不是简单地在p @ list中给出值。 以下是我一直在尝试实施的示例:

res :: X -> X -> Z -- function given

myf :: [X] -> [X] -- Here is my function
myf ps = map newf ps
  where
    newf p@(X oldz) = X newz 
    newz = map (res p) ps 

这是尝试针对整个列表本身更新列表的正确方法吗?

编辑:拼写错误和语法 - 我的道歉还没有把家庭作业标签放在上面

1 个答案:

答案 0 :(得分:3)

  

这是尝试针对整个列表本身更新列表的正确方法吗?

我不确定任何任务的代码是否正确。 看起来您假设p@(X oldz)正在使用构造函数X oldz从列表中获取元素并将其命名为p。但...

您需要说明在应用map (res p)后更改列表时的行为方式。 如果列表的所有“更改”都应仅基于列表的初始值进行,并按从第一个元素到最后一个元素的顺序应用:

myf ps = (buildPlan ps) ps where
    buildPlan [] = id
    buildPlan (x:xs) = map (res x) . buildPlan xs

有些人可能更喜欢:

myf ps = changesPlan ps where
    change x = map (res x)
    changesPlan = foldr (.) id (map change ps)

如果您对列表的“更改”应该从之前的map (res x)进行更改(在遍历列表时使用非函数语言更改所有元素,即使是在下一次迭代时将采用的元素):

myf ps0 = rebuildFrom 0 ps0 where
    rebuildFrom n ps | n >= length ps = ps
    rebuildFrom n ps = rebuildFrom (n+1) ps' where
        x = ps !! n
        ps' = map (res x) ps