list - 如何更改 Haskell 矩阵中的某个值?
问题描述
我对 Haskell 很陌生,还没有完全理解它是如何工作的。在下面的方法中,我想更改矩阵中的某个值,或者像在 Haskell 中实现的那样,列表列表。
setEntry :: [[Int]] -> Int -> Int -> Int -> [[Int]]
setEntry x i j aij =
这是我到目前为止的方法。我知道这并不多,但我真的不知道如何继续。
计划是给它一个矩阵,然后将在第 i 行和第 j 列中可以找到的值更改为 aij。
我会非常感谢任何形式的帮助。
已经提前谢谢你了!
解决方案
首先请注意,实际上没有必要将其指定为 -Int
值矩阵:签名也可以是
setMatEntry :: [[a]] -> Int -> Int -> a -> [[a]]
此外,您也可以修改它,而不是仅仅设置它,即要放入的新值可能取决于旧值,对吗?
modifyMatEntry :: [[a]] -> Int -> Int -> (a -> a) -> [[a]]
有了它,您可以轻松地将原始版本实现为
setMatEntry x i j aij = modifyMatEntry x i j (const aij)
或更短:
setMatEntry x i j = modifyMatEntry x i j . const
使用修饰符来接近它的好处不仅仅是设置一个常量,它构成任何深度的嵌套列表。即没有理由马上去矩阵,你不妨先解决
modifyListEntry :: [a] -> Int -> (a -> a) -> [a]
接着
modifyMatEntry x i j f = modifyListEntry x i
(\r -> modifyListEntry r j f)
在这里,外部modifyListEntry
与[a] -> [a]
函数一起使用,内部modifyListEntry
与a -> a
函数一起使用。
顺便说一句,如果我们改变参数的顺序,这实际上可以缩短:我推荐这个顺序
modifyListEntry :: Int -> (a->a) -> [a] -> [a]
modifyMatEntry :: Int -> Int -> (a->a) -> [[a]] -> [[a]]
所以,现在唯一不完全是微不足道的就是modifyListEntry
. 但很明显,一般来说,如何处理列表——你将有形式的子句
modifyListEntry i f [] = _
modifyListEntry i f (x:xs) = _
...或者也可能模式匹配其他参数的具体值。然后你需要使用递归。试着自己弄清楚。