首页 > 解决方案 > 如何更改 Haskell 矩阵中的某个值?

问题描述

我对 Haskell 很陌生,还没有完全理解它是如何工作的。在下面的方法中,我想更改矩阵中的某个值,或者像在 Haskell 中实现的那样,列表列表。

setEntry :: [[Int]] -> Int -> Int -> Int -> [[Int]]
setEntry x i j aij = 

这是我到目前为止的方法。我知道这并不多,但我真的不知道如何继续。

计划是给它一个矩阵,然后将在第 i 行和第 j 列中可以找到的值更改为 aij。

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

已经提前谢谢你了!

标签: listhaskellmatrixset

解决方案


首先请注意,实际上没有必要将其指定为 -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]函数一起使用,内部modifyListEntrya -> a函数一起使用。

顺便说一句,如果我们改变参数的顺序,这实际上可以缩短:我推荐这个顺序

modifyListEntry :: Int -> (a->a) -> [a] -> [a]
modifyMatEntry :: Int -> Int -> (a->a) -> [[a]] -> [[a]]

所以,现在唯一不完全是微不足道的就是modifyListEntry. 但很明显,一般来说,如何处理列表——你将有形式的子句

modifyListEntry i f [] = _
modifyListEntry i f (x:xs) = _

...或者也可能模式匹配其他参数的具体值。然后你需要使用递归。试着自己弄清楚。


推荐阅读