过滤一个haskell列表

时间:2013-12-19 09:11:53

标签: list haskell

这是我的代码:

    data Review = Review {  artiest :: String,
                    score :: Integer,
                    tour :: Tour,
                    datum :: String,
                    plaats :: String,
                    soortLocatie :: Locatie,
                    topSongs :: [String]
                   } deriving (Eq, Ord, Show)

    getBestLoc [] beste = beste
    getBestLoc (x:xs) beste
        | (score x) > beste = getBestLoc xs (score x)
        | otherwise = getBestLoc xs beste

我正在尝试做的是获得最佳评分,但我希望返回Locatie。现在我得到了最好的分数。我该如何解决这个问题?

修改

所以这是我试过的新功能

    tester :: [Review] -> Locatie
    tester = loc
        where mxscr = maximumBy (compare `on` score)
      loc = map soortLocatie mxscr

2 个答案:

答案 0 :(得分:3)

import Data.List (maximumBy)
import Data.Function (on)

getBestLoc :: [Review] -> Review
getBestLoc = maximumBy (compare `on` score)

此功能将返回得分最高的Review。在那之后,获得最终评论的任何领域都是微不足道的;你想要的功能是soortLocatie . getBestLoc

对正在发生的事情的简要说明:根据文档,on跟随属性:

g `on` f = \x y -> f x `g` f y

所以

compare `on` score == \x y -> score x `compare` score y

换句话说,它比较两个分数,返回LT, GT, EQ之一。然后,maximumBy采用比较函数和列表,并根据比较函数返回最大值。您可以将其视为maximum == maximumBy compare

答案 1 :(得分:1)

虽然user2407038提供了一个完全正确的答案,但为了清晰起见,我想提供略有不同的解决方案。

您希望返回Locatie Review的最佳score。这意味着Review中的所有其他信息对于此过程并不重要。我们应该放弃它。

simplifyReview :: Review -> (Integer, Locatie)
simplifyReview r = (score r, soortLocatie r)

现在我们只想返回具有最大fst元素的对,然后我们可以获得第二个元素。我们将使用maximumBy搜索我们的简化评论列表

import Data.List (maximumBy)

getBestPair :: [(Integer, Locatie)] -> (Integer, Locatie)
getBestPair pairs = maximumBy comparePairs pairs where
  comparePairs (score1, locatie1) (score2, locatie2) = compare score1 score2

最后,我们可以将这些部分组合起来以实现所需的功能

getBestLocatie :: [Review] -> Locatie
getBestLocatie reviews = snd (getBestPair (map simplifyReview reviews))

通常你会看到这是用“功能组合形式”

写的
getBestLocatie :: [Review] -> Locatie
getBestLocatie = snd . getBestPair . map simplifyReview