我有一个列表评论,该列表中包含:
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 =
但我不知道如何完成该功能来计算平均值。
答案 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
计算值的数量。现在,您拥有计算平均值所需的一切。