list - 在 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]] 才能接收整个矩阵,但现在我将它放在列表类型上,因为这就是该方法的作用。
我不明白,我怎样才能返回整个矩阵,特别是因为我必须复制它,不是吗?
我非常感谢任何形式的帮助。
已经提前谢谢你了!
解决方案
如果您将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
因为如果要映射外部列表,不能简单地将内部列表替换为固定值,而是新值依赖于旧值。只有内部列表的一个元素发生了变化。
推荐阅读
- hyperledger-fabric - Fabric 通道更新错误:此策略需要满足 1 个“管理员”子策略
- javascript - Javascrip 无法从 map 方法访问对象属性
- amazon-web-services - 如何将 Google Tag Manager GCP App Engine 映射到 AWS Route53
- javascript - 我的 JavaScript DOM 代码打印简单文本有什么问题?
- node.js - GET请求上的Nodejs IPV6 IP地址不一致
- installation - MakeNSIS:无法在 Windows 和 PyCharm 上安装
- jquery - 当我点击弹出窗口时使用 Blur() 隐藏弹出窗口时,切换按钮不切换
- javascript - SwipeJS 无法正常运行
- angular - 使用 laravel CMS 后端在 S3 上部署 Angular 应用程序
- r - 在 R 中合并时有没有办法更新现有变量?