从数据列表中计算平均值

时间:2013-12-18 11:01:19

标签: haskell filter average

我有一个列表评论,该列表中包含:

    data Review = Review artist::String score::Integer Tour String String Locatie [String]

所以我要做的是计算特定艺术家评论的平均分数。到目前为止我所拥有的功能是过滤像这样的艺术家的评论:

    filterByArtiest :: String -> [Review] -> [Review]
    filterByArtiest art = filter (\a -> artiest a == art)

这就是我想要计算平均值的原因:

    gem :: String -> (String -> [Review] -> [Review]) -> Double
    gem art = 

但我不知道如何完成该功能来计算平均值。

2 个答案:

答案 0 :(得分:2)

你要做的很简单:

  • 过滤掉您感兴趣的特定艺术家。
  • 提取(映射)该特定艺术家的所有得分。
  • 按照该艺术家获得的分数列表计算他的平均值。

假设您的评论记录是这样的:

data Review = Review {
     artist::String,
     score::Integer,
     tour :: String ,
     locatie :: [String] 
    }

您可以使用此功能计算平均值:

average :: String -> [Review] -> Double
average artistName reviews = fromIntegral (sum scores) / fromIntegral (length scores)
    where artists = filterByArtiest artistName reviews
          scores = map score artists

答案 1 :(得分:1)

首先,您需要过滤您的列表,以获得针对部分艺术家的评论。如果您的评论列表名为reviews,则此类内容应该有效:

joesReviews = filter (\review -> artist review == "Joe Bloggs") reviews

接下来,将所有分数提取到列表中。

scores = map score joesReviews

现在您可以使用sum scores来确定总分。然后使用length scores计算值的数量。现在,您拥有计算平均值所需的一切。