【问题标题】:How do I change a certain value in a matrix in Haskell?如何更改 Haskell 矩阵中的某个值?
【发布时间】:2021-01-17 15:36:48
【问题描述】:

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

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

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

计划是给它一个矩阵,然后把第i行第j列能找到的值改成aij。

如果能提供任何帮助,我将不胜感激。

提前谢谢你!

【问题讨论】:

  • 如何从尝试更改列表的第 i 个元素开始?如果你能做到这一点,你应该可以很好地为你的矩阵写setEntry
  • 好的,我会试试的。谢谢
  • 仅供参考,Haskell 中的实际数组比嵌套列表更适合处理矩阵的数据结构。

标签: list haskell matrix set


【解决方案1】:

首先请注意,实际上没有必要将其指定为Int-valued 矩阵:签名也可以是

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

使用 修饰符 来处理它的好处不仅仅是设置一个常量,它构成任何深度的嵌套列表。 IE。没有理由马上去矩阵,你不妨先解决

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) = _

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    • 2011-10-14
    • 1970-01-01
    • 2019-11-17
    • 2021-09-10
    相关资源
    最近更新 更多