2014-02-24 58 views
1

的平均我有获取计算列表哈斯克尔

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

这个输出号码清单,我想有结果是这些数字的平均值。有可能以某种方式在结果上使用foldr函数?

回答

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 

邦模式使计算效率。

另请参阅:The Most Fuun You Can Have: Beautiful Folding