我正在处理与Haskell的小程序。可能答案很简单,但我试着没有结果。
所以我的程序中的一个部分是列表:
first = [(3,3),(4,6),(7,7),(5,43),(9,9),(32,1),(43,43) ..]
根据该列表,我想在() =
中使用相同的元素创建一个新的:
result = [3,7,9,43, ..]
答案 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]