如何比较[[]]中的元素?

时间:2017-12-18 10:28:42

标签: list haskell

我正在处理与Haskell的小程序。可能答案很简单,但我试着没有结果。

所以我的程序中的一个部分是列表:

first = [(3,3),(4,6),(7,7),(5,43),(9,9),(32,1),(43,43) ..]

根据该列表,我想在() =中使用相同的元素创建一个新的:

result = [3,7,9,43, ..]

3 个答案:

答案 0 :(得分:3)

即使你似乎没有尽最大努力自己解决这个问题,但我会给你答案,因为它是如此微不足道,因为Haskell是一门很棒的语言。

使用此签名创建一个函数:

f :: Eq a => [(a,a)] -> [a]
f dat = [f | (f,s) <- dat, f == s ]

它需要一个元组列表并返回一个int列表。

像这样实施:

findIdentical :: [(Int, Int)] -> [Int]

如您所见,findIdentical [] = [] findIdentical ((a,b) : xs) | a == b = a : (findIdentical xs) | otherwise = findIdentical xs 是一个递归函数,它比较两个项之间相等的元组,然后在找到相等的情况下将其添加到结果列表中。

答案 1 :(得分:1)

您可以使用列表理解来执行此操作。我们遍历f,s)中的每个元组first,因此我们在列表推导的右侧写(f,s) <- first,并需要过滤f和{{ 1}}是相等的,所以s。在这种情况下,我们会将f == s(或f)添加到s。所以:

result

我们可以把它变成一个函数,它将2元组result = [ f | (f,s) <- first, f == s ] 的列表作为输入,并比较这两个元素,并返回一个列表[(a,a)]

[a]

答案 2 :(得分:1)

一种简单的方法是使用Prelude的filter函数,该函数具有类型定义:

filter :: (a -> Bool) -> [a] -> [a]

您需要做的就是提供有关如何过滤列表中元素的谓词,以及要过滤的列表。您可以在下面轻松完成此任务:

filterList :: (Eq a) => [(a, a)] -> [a]
filterList xs = [x | (x, y) <- filter (\(a, b) -> a == b) xs]

其行为符合预期:

*Main> filterList [(3,3),(4,6),(7,7),(5,43),(9,9),(32,1),(43,43)]
[3,7,9,43]