首页 > 解决方案 > 在 Haskell 中更改某个值后如何返回整个矩阵?

问题描述

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

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

到目前为止我的代码:

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]] 才能接收整个矩阵,但现在我将它放在列表类型上,因为这就是该方法的作用。

我不明白,我怎样才能返回整个矩阵,特别是因为我必须复制它,不是吗?

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

已经提前谢谢你了!

标签: listhaskellmatrixmethodsoutput

解决方案


如果您将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

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


推荐阅读