我有家庭作业我要使用一个函数更新列表,该函数接受两个元素并返回函数中给出的第一个元素的一部分的值。因此,需要通过遍历每个元素来更新整个列表,并通过对列表中的所有其他元素(包括其自身)应用该函数来更新其值。
到目前为止,我一直在尝试首先映射列表(以便每个元素都完成相同),然后通过再次映射指定元素的值来专门更新每个元素值,但是在尝试仅映射特定元素时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
这是尝试针对整个列表本身更新列表的正确方法吗?
编辑:拼写错误和语法 - 我的道歉还没有把家庭作业标签放在上面
答案 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