查找矩阵中的元素数量

时间:2017-08-28 13:01:59

标签: haskell

我是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

这就是我所得到的,我真的很想知道下一步该做什么

1 个答案:

答案 0 :(得分:1)

tl; dr 您想要filter someCondition (toList matrix) == otherList的效果,细微的细节会根据您的矩阵类型和您的具体需求而变化。

完整答案

我不知道您正在使用的Matrix类型,但对于任何合理定义的矩阵类型,此方法都是类似的。

对于这个答案,我假设你正在使用Hackage包中的Data.Matrixmatrix

您认为应该使用filter是对的。从功能上思考,你想要从矩阵中消除一些元素,并根据条件保留其他元素。但是,矩阵不能提供一种自然的方式来对其执行filter,因为这个想法并没有真正明确定义。因此,我们希望首先将矩阵中的元素提取到列表中。 matrix包提供了以下功能,就是这样。

toList :: Matrix a -> [a]

获得列表表示后,您可以非常轻松地使用filter来获取所需的元素。

一些警告和注释。

  • 如果您使用的矩阵包本身并未定义toList,请检查它是否为矩阵类型定义了Foldable个实例。如果是,则Data.Foldable具有适用于所有toList类型的通用Foldable
  • 请注意这里的订购。由于矩阵是二维的并且列表本质上是一维的,所以 order 元素应该放入列表中并不完全清楚。如果订单对您所做的任何事情都很重要,您可能需要付出额外的努力来保证所需的订单。如果无关紧要,请考虑使用Data.Set或其他一些无序集合而不是列表。
  • 我在checkMatrix实施中没有看到任何限制。请记住,比较列表元素会增加Eq a约束,如果您想使用无序集合,则会添加Ord a