【问题标题】:How do I return an entire matrix after having changed a certain value in Haskell? [duplicate]在 Haskell 中更改某个值后如何返回整个矩阵? [复制]
【发布时间】:2021-01-18 14:21:55
【问题描述】:

我对我的示例有一个非常具体的问题。

我的目标是改变矩阵中的某个值,然后返回整个矩阵。

到目前为止我的代码:

replace :: [a] -> (Int,a) -> [a]
replace [] _ = []
replace (_:xs) (0,a) = a:xs
replace (x:xs) (n,a) =
                      if n < 0
                      then (x:xs)
                      else x: replace xs (n-1,a)



setEntry :: [[Int]] -> Int -> Int -> Int -> [Int]
setEntry x i j aij = replace (x!!(i-1)) ((j-1),aij)

我的目标是达到以下目标:

setEntry [[1,2,3],[3,2,1],[1,2,1]] 2 2 9

结果

[[1,2,3],[3,9,1],[1,2,1]]

我当前的代码仅输出值已更改的行。 所以在这种情况下:

[3,9,1]

我知道,我必须将输出类型更改为 [[Int]] 才能接收整个矩阵,但现在我将它放在列表类型上,因为这是该方法的作用。

我不明白,我如何才能返回整个矩阵,尤其是因为我必须复制它,不是吗?

我非常感谢任何形式的帮助。

提前谢谢你!

【问题讨论】:

  • 提示:您需要调用replace 两次,一次用于行,一次用于列。
  • 谢谢!我花了最后 15 分钟尝试这个,但我似乎是脑死什么的。我还没有弄清楚如何在整个矩阵上调用替换。你介意再给我一个提示吗? :)
  • 您当前正在生成i-1th 行的结果。那么,如果将原始矩阵的整个i-1th 行替换为刚刚生成的结果会怎样?请记住,当 a ~ [x] 时,replace 函数的类型变为 [[x]] -&gt; (Int, [x]) -&gt; [[x]],它可以完美地用作矩阵的“行替换”函数。

标签: list haskell matrix methods output


【解决方案1】:

如果您将replace 函数概括为采用更新函数而不是固定值,则可以将其用于外部列表和内部列表:

update :: Int -> (a -> a) -> [a] -> [a]
update _ _ []     = []
update 0 f (x:xs) = (f x) : xs
update n f (x:xs) = if n < 0
                     then (x:xs)
                     else x : update (n-1) f xs

因为如果要映射外部列表,不能简单地将内部列表替换为固定值,而是新值取决于旧值。内部列表中只有一个元素发生了变化。

【讨论】:

  • (美学说明:我会交换前两个参数,以便它干净地链接而不颠倒索引的顺序......)
  • @luqui 谢谢你的评论。不过没看懂,能不能说详细点?
  • 只是 update 2 (update 3 (const 42)) 更新第 2 行第 3 列比 update (update (const 42) 3) 2 更容易阅读。也与“最终权重”原则有关:可能(在语法上)更复杂的参数应该放在参数列表的后面,以便在它们所应用的函数附近保留更多参数。不过,Haskell 参数顺序是一门艺术。
  • @luqui 是的,这读起来好多了。非常感谢您的解释。太好了,您能够立即发现这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-20
  • 2011-10-14
  • 2017-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多