2013-03-06 71 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