Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 从数据列表中计算平均值_Haskell_Filter_Average - Fatal编程技术网

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)
。如果你有一张长长的单子,并且不想把它完全记在记忆中,然后重复两次,这可能很重要。