获得计算列表haskell的平均值 [英] Getting average of calculated list haskell

查看:180
本文介绍了获得计算列表haskell的平均值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有

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

这会输出一个数字列表,我想让结果成为平均值这些数字。是可以在结果上使用foldr函数吗?

结果带有一个函数来计算任何数字列表的平均值。

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

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

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

Bang模式使计算更有效率。



另见:最富有你可以有:美丽的折叠


I have

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

This outputs a list of numbers, I want to have the result be the average of these numbers. is is possible to use the foldr function on the result somehow?

解决方案

You can keep your function as is and post-process its result with a function to calculate an average of any list of numbers.

One way to code it so it does only one traversal of the list is

{-# 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 patterns make the calculation efficient.

see also: The Most Fuun You Can Have: Beautiful Folding

这篇关于获得计算列表haskell的平均值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆