2

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

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

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

所以我得到的是:

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

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

4

2 回答 2

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
于 2013-10-24T19:12:03.890 回答
2

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

countOccurences :: Eq a => a -> [(a, b)] -> Int
countOccurences e = length . filter ((==)e) . map fst
于 2013-10-24T19:10:46.777 回答