2017-09-19 50 views
0

的名單我是相當新的哈斯克爾,並儘量做到以下幾點:哈斯克爾accesing子表同時過濾列表

filter (((!!) subList (fromJust (elemIndex String [String]))) == String) [[string]] 

我替換它們的類型名稱,使其更易於閱讀。問題是我不能做subList,但(!!)將一個列表作爲參數。那麼我該怎麼寫呢?

編輯:

我寫seperately過濾條件,它的工作原理,但問題仍然是相同的:

findGood :: [String] -> String -> [String] -> String -> Bool 

,但我還需要填寫所有的值,雖然第一[字符串]是子列表。所有其它的值可以輸入..

編輯:

我解決了這個問題,我需要什麼做的就是把[字符串]最後,然後我可以離開它在過濾

所以

findGood :: String -> [String] -> String -> [String] -> Bool 
      filter (findGood a b c) [[String]] 

那是什麼工作,這就是我想要的。 (不需要D)

+1

我的猜測是,如果您取出要過濾的功能並單獨寫入,這將變得更容易。但是如果你給我們一些例子的輸入和輸出,理解你在做什麼會更容易。 –

+0

如果你可以用文字解釋你在這裏試圖做什麼,這將會有所幫助。 – Erik

+1

請不要發佈一些無效的代碼片段,首先解釋*你想要完成什麼*。你想用這個'filter'解決什麼問題? –

回答

1

鑑於你想比較錢和檢查money > 500它是更有意義的將它存儲爲Int而不是String。此外,我會說,將每個條目存儲爲一個元組,並且擁有一個元組列表比使用列表列表更有意義(這也是Int實現貨幣所必需的,因爲您不能擁有不同類型列表的列表) 。

所以這個表的類型是[(String, Int)]

filter檢查列表並根據條件檢查每個元素。在這種情況下,條件是如此簡單,我不打擾它使自己的功能(除非你需要在很多地方重複使用它)。

當給出一對(String, Int)類型時,我們只是想檢查第二個值是否大於500.所以條件就是snd row > 500其中row是我們給出的元組代表表中的一行。

這給我們留下了: filter (\row -> snd row > 500) table

測試上[("Geoff", 600), ("Bill", 700), ("Bill Jr.", 10)]這給[("Geoff", 600), ("Bill", 700)]預期。

+0

感謝,對所描述的場景它的工作原理的確,但我需要解決更抽象的問題。特別是我在第二次編輯中做了什麼。 – BaasBartMans

+0

@BaasBartMans不客氣,下次如果你描述了問題中的抽象問題,它可能會有所幫助。沒有人可以幫助你,如果他們不知道問題是什麼。 –