Haskell比较元素[[]]
问题描述:
我正在用Haskell处理小程序。 也许答案很简单,但我试着得不到结果。 所以我在程序的部分之一是列表Haskell比较元素[[]]
first = [(3,3),(4,6),(7,7),(5,43),(9,9),(32,1),(43,43) ..]
,并根据该列表我要做出新的一个与元素是在()=
result = [3,7,9,43, ..]
如果相等你有时间和耐心,我将不胜感激
答
即使你似乎没有做出最小的努力来自己解决这个问题,我会给你答案,因为它是如此微不足道,因为Haskell是一门伟大的语言。
与此签名创建一个函数:
findIdentical :: [(Int, Int)] -> [Int]
它需要一个元组列表,并返回整数的列表。
这样实现:
findIdentical [] = []
findIdentical ((a,b) : xs)
| a == b = a : (findIdentical xs)
| otherwise = findIdentical xs
正如你所看到的,findIdentical
是一个递归函数,两个项目之间的平等比较的元组,然后如果发现平等把它添加到结果列表。
答
你可以做这个例如列表理解。我们迭代遍历first
中的每个元组f,s)
,所以我们在列表理解的右侧编写(f,s) <- first
,并且需要对f
和s
相等的事实进行过滤,所以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]
如果你表现出一定的attemt,我们将不胜感激。 http://idownvotedbecau.se/noattempt/ –
那么你在哪里坚持你的尝试?请注意,该网站适合回答特定问题。像“这是我的任务,帮助我,我不知道从哪里开始”这样的请求被忽视了。 –
我正在尝试像这样'result = [x | x kefir