在列表列表中查找x

时间:2013-03-06 06:43:15

标签: list haskell

我的学业作业有点问题。我必须编写代码,它会在列表列表中找到任何x(int或letter)。

我有这样的事情:

 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 个答案:

答案 0 :(得分:5)

稍微重命名,我想你刚刚写了这个:

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

我认为这不是你的意思。 (在你的代码中,你有两个名为x的变量,一个影响另一个。)

您的问题并未说明您使用或不允许使用的工具。

显然elem会在列表中找到内容。通过“查找”,我的意思是它返回一个Bool,指示目标项是否存在。但是如何处理列表列表?

列表推导始终返回一个列表,因此如果您希望find返回Bool,则不需要列表推导。

您可以使用mapelem应用于列表列表中的每个列表 - 但现在您有一个Bool列表。有两种方法可以解决这个问题。一种略显愚蠢的方法是使用elem查看列表是否包含True。但更合理的方法是使用内置的or函数,该函数采用Bool列表的逻辑或。 (还有一个相应的and函数。)

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

还有另一种方法可以做到这一点;有一个名为any的内置函数,它将函数应用于一个东西列表,如果提供的函数返回True,则返回True。所以你可以做到

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