【问题标题】:Getting average of calculated list haskell [duplicate]获取计算列表haskell的平均值[重复]
【发布时间】:2014-02-24 19:53:39
【问题描述】:

我有

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

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

【问题讨论】:

    标签: haskell fold


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-18
      • 1970-01-01
      • 2011-03-19
      • 2015-11-02
      • 2018-06-21
      • 1970-01-01
      • 1970-01-01
      • 2021-06-03
      相关资源
      最近更新 更多