2017-08-28 111 views
0

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

这就是所有我得到了,我真的很失落为下一步做什么

+2

欢迎来到SO。那么,如果你不希望别人认为你想要给你的答案,请显示你已经做出的尝试。 –

+2

“我尝试过......” - 这是完全合适的,并鼓励在您的回答中包含您尝试编译和运行的文字代码(包括多段代码)以及代码给您的错误。 – user2407038

+5

什么是矩阵? – melpomene

回答

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实施中没有看到任何限制。请记住,比较列表元素会添加约束条件,如果您想使用无序集合,则会添加Ord a