2013-03-06 26 views
2

我的作業上學有點小問題。我必須編寫代碼,它可以在列表列表中找到任何x(int或letter)。在列表中找到x

我有這樣的事情:

find x xxs = [ [ x | x <- xs, x `elem` xs ] | xs <- xxs ] 

Hugs98接受它沒有任何異常,但它不工作。

Input: find 2 [[1,1,1,1],[4,4,4,4],[3,3,3]] 
Output: [[1,1,1,1],[4,4,4,4],[3,3,3,3]] 
+1

我不知道列表理解,但這是你如何可以做到沒有:'find x = foldr(||)False。 map(elem x)' – Pubby 2013-03-06 07:03:05

+3

@Pubby'foldr(||)False'只是'或' – is7s 2013-03-06 07:11:48

+0

你寫的內容有一個問題,就是你的內部列表理解是「我想要列表中的所有元素都是所述列表的元素「。這是一個簡單而真實的陳述,顯然不是你想要的。 Pubby和is7s提供了一個很好的解決方案。 – gspr 2013-03-06 07:40:56

回答

5

隨着一點點的重命名,我覺得你剛纔寫的:

find x yss = [ [ y | y <- ys, y `elem` ys ] | ys <- yss ] 

我不認爲這就是你的意思做。 (在你的代碼中,你有兩個變量名爲x,其中一個隱藏另一個變量。)

你的問題沒有說明你是或不被允許使用什麼工具。

顯然elem找到列表中的東西。而「發現」,我的意思是它返回一個Bool表示目標物品是否存在。但如何處理列表清單?

列表理解總是返回一個列表,所以如果您希望find返回Bool,您不需要列表理解。

您可以使用mapelem應用於列表中的每個列表 - 但現在您有一個列表Bool s。有兩種方法可以解決這個問題。一個稍微低調的方法是使用elem來查看列表是否包含任何地方的True。但更理智的方法是使用內置的or函數,該函數採用列表Bool的邏輯或。 (還有一個相應的and功能。)

find x yss = or (map (x `elem`) yss) 

還有另外一種方式,你也可以這樣做;有一個名爲any的內置函數,該函數將函數應用於一系列內容,並返回True,前提是提供的函數返回True。所以你可以做

find x yss = any (x `elem`) yss 
+0

我忘了寫,應該用bool返回。但是你的功能非常有幫助,非常感謝你:) – 2013-03-06 14:32:38

+0

「如果你希望有一個'Bool'」 - ''不爲null。 concat $'...? – 2013-03-06 18:54:56

+0

http://www.willamette.edu/~fruehr/haskell/evolution.html ;-) – MathematicalOrchid 2013-03-06 21:03:52