Haskell 从数据列表中计算平均值
我有一份清单,清单上有:Haskell 从数据列表中计算平均值,haskell,filter,average,Haskell,Filter,Average,我有一份清单,清单上有: data Review = Review artist::String score::Integer Tour String String Locatie [String] 所以我想做的是计算某个艺术家评论的平均分数。到目前为止,我所拥有的功能还可以过滤艺术家的评论,比如: filterByArtiest :: String -> [Review] -> [Review] filterByArtiest art = filter (
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 =
但是我不知道如何完成这个函数来计算平均值。首先,你需要过滤你的列表,以便只获得某个特定艺术家的评论。如果您的评论列表被称为
评论
,那么类似的内容应该可以工作:
joesReviews = filter (\review -> artist review == "Joe Bloggs") reviews
接下来,将所有分数提取到列表中
scores = map score joesReviews
现在您可以使用
总分
确定总分。然后使用length scores
计算值的数量。现在,您已经拥有了计算平均值所需的一切。您需要做的很简单:
- 过滤掉你感兴趣的特定艺术家
- 提取(绘制)那个艺术家的所有分数
- 根据那位艺术家获得的分数表计算他的平均分
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
那么我该如何声明分数函数呢?scores::Map.Map->[score]?如果将其作为右折叠编写,则可以获得更好的平均值函数:
avg=uncurry(/)。foldr(\x(s,n)->(s+x,n+1))(0,0)
。如果你有一张长长的单子,并且不想把它完全记在记忆中,然后重复两次,这可能很重要。