这是我的代码:
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
答案 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