2

我上学的作业有点问题。我必须编写代码,它将在列表列表中找到任何 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]] 
4

1 回答 1

5

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

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

我不认为那是你的本意。(在您的代码中,您有两个名为x的变量,一个隐藏另一个。)

您的问题没有说明您是或不允许使用哪些工具。

清楚elem地在列表中找到东西。通过“查找”,我的意思是它返回一个Bool指示目标项目是否存在的值。但是如何处理列表列表呢?

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

您可以使用map应用于elem列表列表中的每个列表 - 但现在您有一个Bools 列表。有两种方法可以解决这个问题。一种稍微笨拙的方法是使用elem来查看列表是否包含True任何地方。但更明智的方法是使用内置or函数,该函数采用Bools 列表的逻辑或。(也有相应的and功能。)

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

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

find x yss = any (x `elem`) yss
于 2013-03-06T08:53:54.427 回答