所以我有一个像这样的元组列表:
xs = [("a","b"),("a","c"),("b","d")
我想要一个函数来计算特定值出现在元组第一个位置的次数。如果我使用列表xs和字母'a',它将返回值2,因为字母'a'在元组的第一个位置出现两次。此函数不应该是递归的。
所以我得到的是:
f xs = (fst $ unzip xs) / length(xs)
现在我将所有元素放在列表中。如果它是递归的,这将很容易,但如果我不想那样,我该怎么办呢?
答案 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