【问题标题】:Updating List Elements, Haskell更新列表元素,Haskell
【发布时间】:2010-05-15 01:54:05
【问题描述】:

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

到目前为止,我一直在尝试首先映射列表(以便每个元素都完成相同的操作),然后通过再次映射指定元素的值来专门更新每个元素的值,但是尝试仅映射特定元素的值值通过:函数、特定元素和整个列表 我不断收到抱怨说我在推断从“映射函数 p@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 

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

编辑:拼写错误和语法 - 我很抱歉没有把作业标签放在上面

【问题讨论】:

  • 您能否提供代码示例来展示您描述的方法?您可能还想添加一个作业标签。
  • 您的示例代码没有多大意义--p 不在newz 的范围内,newf 没有使用它的参数,您还没有定义resXZ 数据类型,除此之外,我什至无法弄清楚您要做什么。

标签: list haskell map


【解决方案1】:

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

我不确定该代码是否适用于任何任务。 看起来您假设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

【讨论】:

    猜你喜欢
    • 2021-12-25
    • 2011-08-24
    • 1970-01-01
    • 2020-05-14
    • 2012-10-15
    • 2022-10-09
    • 2021-01-03
    • 2015-02-28
    • 1970-01-01
    相关资源
    最近更新 更多