2014-02-24 55 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