2017-08-28 161 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