获得计算列表的平均值haskell

时间:2014-02-24 19:53:39

标签: haskell fold

我有

avgRatingsForDirector :: String -> [Film] -> [Int]
avgRatingsForDirector _ [] = []
avgRatingsForDirector requestedDirector ((Film _ director _ ((_, rating):ratings)):restOfFilms)
    | requestedDirector == director = [rating] ++ avgRatingsForDirector requestedDirector restOfFilms
    | otherwise = avgRatingsForDirector requestedDirector restOfFilms

这会输出一个数字列表,我希望结果是这些数字的平均值。有可能以某种方式对结果使用foldr函数吗?

1 个答案:

答案 0 :(得分:1)

您可以按原样保留您的功能,并使用函数对其结果进行后处理,以计算任何数字列表的平均值。

编码它的一种方法是只进行一次遍历列表

{-# LANGUAGE BangPatterns #-}
import Data.List

avg :: (Integral a, Fractional b) => [a] -> b
avg xs = g $ foldl' c (0,0) xs
 where
   c (!a,!n) x = (a+x,n+1)
   g (a,n) = fromIntegral a / fromIntegral n

Bang模式使计算更有效。

另见:The Most Fuun You Can Have: Beautiful Folding