我是Haskell的新人,所以让我有点松懈:P
我需要编写一个Haskell函数,该函数遍历矩阵并将所有匹配元素的列表输出到给定元素(如使用过滤器),然后将列表与另一个匹配以检查它们是否相同。
checkMatrix :: Matrix a -> a -> [a] -> Bool
我尝试使用过滤器的变体,并使用!!操作员,我无法弄清楚。我真的不想把答案递给我,只需要一些指示让我走上正确的道路
checkMatrix :: Matrix a -> a -> [a] -> Bool
checkMatrix matr a lst = case matr of
x:xs | [] -> (i don't really know what to put for the base case)
| filter (== True) (x:xs !! 0) -> checkMatrix xs a lst
这就是我所得到的,我真的很想知道下一步该做什么
答案 0 :(得分:1)
tl; dr 您想要filter someCondition (toList matrix) == otherList
的效果,细微的细节会根据您的矩阵类型和您的具体需求而变化。
我不知道您正在使用的Matrix
类型,但对于任何合理定义的矩阵类型,此方法都是类似的。
对于这个答案,我假设你正在使用Hackage包中的Data.Matrix
类matrix
。
您认为应该使用filter
是对的。从功能上思考,你想要从矩阵中消除一些元素,并根据条件保留其他元素。但是,矩阵不能提供一种自然的方式来对其执行filter
,因为这个想法并没有真正明确定义。因此,我们希望首先将矩阵中的元素提取到列表中。 matrix
包提供了以下功能,就是这样。
toList :: Matrix a -> [a]
获得列表表示后,您可以非常轻松地使用filter
来获取所需的元素。
一些警告和注释。
toList
,请检查它是否为矩阵类型定义了Foldable
个实例。如果是,则Data.Foldable
具有适用于所有toList
类型的通用Foldable
。Data.Set
或其他一些无序集合而不是列表。checkMatrix
实施中没有看到任何限制。请记住,比较列表元素会增加Eq a
约束,如果您想使用无序集合,则会添加Ord a
。