Haskell比较元素[[]]

Haskell比较元素[[]]

问题描述:

我正在用Haskell处理小程序。 也许答案很简单,但我试着得不到结果。 所以我在程序的部分之一是列表Haskell比较元素[[]]

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

,并根据该列表我要做出新的一个与元素是在()=

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

如果相等你有时间和耐心,我将不胜感激

+3

如果你表现出一定的attemt,我们将不胜感激。 http://idownvotedbecau.se/noattempt/ –

+3

那么你在哪里坚持你的尝试?请注意,该网站适合回答特定问题。像“这是我的任务,帮助我,我不知道从哪里开始”这样的请求被忽视了。 –

+0

我正在尝试像这样'result = [x | x kefir

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

与此签名创建一个函数:

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

它需要一个元组列表,并返回整数的列表。

这样实现:

findIdentical [] = [] 
findIdentical ((a,b) : xs) 
    | a == b = a : (findIdentical xs) 
    | otherwise = findIdentical xs 

正如你所看到的,findIdentical是一个递归函数,两个项目之间的平等比较的元组,然后如果发现平等把它添加到结果列表。

+0

'findIdentical = filter(uncurry(==))。 map fst' –

+0

您的观点是什么,一个问题有无数可能的解决方案?说实话,我更喜欢我的功能,因为它非常明确,而你在一行中使用5个函数。它确实减少了50%的代码行,这很好。 – Glubus

+0

@SebastianRedl您的解决方案甚至不会检查 – gallais

你可以做这个例如列表理解。我们迭代遍历first中的每个元组f,s),所以我们在列表理解的右侧编写(f,s) <- first,并且需要对fs相等的事实进行过滤,所以f == s。在这种情况下,我们将f(或s)添加到result。所以:

result = [ f | (f,s) <- first, f == s ] 

我们可以把它变成是作为输入的2元组[(a,a)]名单,而这两个元素进行比较,并返回一个列表[a]功能:

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

一个简单的方法来做到这一点是使用前奏的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]