我如何计算Haskell中元组的元素?

时间:2013-10-24 19:04:48

标签: haskell

所以我有一个像这样的元组列表:

xs = [("a","b"),("a","c"),("b","d")

我想要一个函数来计算特定值出现在元组第一个位置的次数。如果我使用列表xs和字母'a',它将返回值2,因为字母'a'在元组的第一个位置出现两次。此函数不应该是递归的。

所以我得到的是:

f xs = (fst $ unzip xs) / length(xs)

现在我将所有元素放在列表中。如果它是递归的,这将很容易,但如果我不想那样,我该怎么办呢?

2 个答案:

答案 0 :(得分:4)

如果我们不使用递归,我们需要使用一些更高阶的函数。特别是,filter看起来很有用,它会删除不满足某些条件的元素。

如果我们使用filter,我们可以得到所有元素的列表,第一个元素是正确的。

 count :: Eq a => [(a, b)] -> Int
 count x = length . filter ((== x) . fst)

我想,既然你正在学习,你应该努力理解一些折叠,从

开始
count x = foldr step 0
  where step (a, b) r | a == x = 1 + r
                      | otherwise = r

答案 1 :(得分:2)

如果将第一个元素映射到列表中,则查找所有值的值,并计算结果列表的长度:

countOccurences :: Eq a => a -> [(a, b)] -> Int
countOccurences e = length . filter ((==)e) . map fst