haskell 分别计算列表中正数和负数

mbskvtky  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(161)

我可以用这个来计算积极发生次数:

count :: [Int] -> Int
count xs = length [ x | x <- xs, x > 0]

但是,我无法使它既能计算正数又能计算负数。
对于输入[1,2,3, -1,-2],我想将(3,2)作为输出。如何实现这一点?

bkhjykvo

bkhjykvo1#

你可以使用一个“fold”。这里你传递一个2元组作为“accumulator”,你递增两个中的一个,这取决于项是正还是负。
因此,这看起来像:

import Data.Foldable(foldl')

count_pn :: (Num a, Ord a) => [a] -> (Int, Int)
count_pn = foldl' f (0, 0)
  where f (np, nn) x
          | … = …
          | otherwise = …

这里你仍然需要实现f函数,这里(np, nn)是一个二元组,其中包含了到目前为止计算的正项和负项的数量,x是我们接下来要计算的元素。

相关问题