所以我有一个像这样的元组列表:
xs = [("a","b"),("a","c"),("b","d")
我想要一个函数来计算某个值出现在元组的第一个位置的次数。如果我使用列表 xs 和字母“a”,它将返回值 2,因为字母“a”在元组的第一个位置出现了两次。这个函数不应该是递归的。
所以我得到的是:
f xs = (fst $ unzip xs) / length(xs)
现在我将所有元素都列在一个列表中。如果它是递归的,这将很容易,但如果我不想要那样,我该怎么做?
所以我有一个像这样的元组列表:
xs = [("a","b"),("a","c"),("b","d")
我想要一个函数来计算某个值出现在元组的第一个位置的次数。如果我使用列表 xs 和字母“a”,它将返回值 2,因为字母“a”在元组的第一个位置出现了两次。这个函数不应该是递归的。
所以我得到的是:
f xs = (fst $ unzip xs) / length(xs)
现在我将所有元素都列在一个列表中。如果它是递归的,这将很容易,但如果我不想要那样,我该怎么做?
如果我们不使用递归,我们需要使用一些高阶函数。特别是,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
如果将第一个元素映射到列表中,则查找所有出现的值并计算结果列表的长度:
countOccurences :: Eq a => a -> [(a, b)] -> Int
countOccurences e = length . filter ((==)e) . map fst