我有
avgRatingsForDirector :: String -> [Film] -> [Int]
avgRatingsForDirector _ [] = []
avgRatingsForDirector requestedDirector ((Film _ director _ ((_, rating):ratings)):restOfFilms)
| requestedDirector == director = [rating] ++ avgRatingsForDirector requestedDirector restOfFilms
| otherwise = avgRatingsForDirector requestedDirector restOfFilms
这会输出一个数字列表,我希望结果是这些数字的平均值。有可能以某种方式对结果使用foldr函数吗?
答案 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模式使计算更有效。