2014-12-21 2 views
2

나는 하스켈에 [(item, score)] 구조의 목록을 가지고 있습니다. 목록에서 가장 높은 점수를 얻은 항목을 얻는 방법

highestScoreItem :: [(Item, Int)] -> Item 

highestScoreItem

은 (항목, INT)의리스트를 취하는 함수이며, 가장 높은 점수와 항목을 반환합니다.

머리 꼬리 재귀를 시도했지만 아직 기능을 수행 할 수 없습니다. 필터와 목록 이해는 둘 다 올바른 방법으로 보이는 것 같지만이 우물을 사용하기에 충분히 앞선 것은 아닙니다 ...

어떤 도움을 주시겠습니까?

답변

6

필터 목록 이해처럼 Data.ord 모듈에서 comparing 기능을 사용하십시오.

아니요. 목록을 단일 요소 (Item, Int)으로 줄이고 fst을 사용하고 싶습니다. 그것은 필터가 아니라 접힌 부분입니다. 당신이 이쌍 (Item, Int)을 비교

compareScore :: (Item, Int) -> (Item, Int) -> Ordering 

snd에 따라 기능이 있다면

maximumBy :: (a -> a -> Ordering) -> [a] -> a 

,이처럼 사용할 수 있습니다 :

highestScoreItem = fst . maximumBy compareScore 

maximumByData.List에있다

운 좋게

compareScore = comparing snd 

을 그리고는 당신이 필요로하는 모든입니다 : 거기에 당신이 compareable 어떤면에서 뭔가를 비교할 수있는 Data.Ord에서 comparing입니다.운동으로 comparingmaximumBy을 직접 작성한 다음 foldr으로 문제를 해결해보십시오.

+0

감사! 나는 결코 들어 본 적이 없지만 아주 유용하게 보인다 ... 내 자신의 비교와 최대 글을 끝냈다. btw – Elliot

+0

@ 엘리엇 : 폴딩은 꽤 흔하다. LYAH를 따라 간다면 6 장에서'foldl'과'foldr'을 보게 될 것입니다. – Zeta

2

튜플 목록이 있으며 튜플의 두 번째 요소를 기반으로 최대 값을 선택하려고합니다.

두 번째 요소를 기준으로 비교할 수있는 사용자 지정 비교기와 함께 maximumBy 함수를 사용해야합니다. 여기

import Data.Function (on) 
import Data.List (maximumBy) 
main = print $ fst (maximumBy (compare `on` snd) [(1, 5), (2, 1)]) 
-- 1 

,

maximumBy는에 사용될 실제 값을 얻기 위해, 우리는 첫 번째 파라미터로 전달 된 비교 함수 snd)(compare을 튜플리스트에서 각각의 모든 터플을 취하고 호출 비교.

우리는 snd 함수를 사용하여 비교를 위해 튜플의 두 번째 요소 만 가져옵니다. 따라서 maximumBy은 비교를 위해 모든 튜플의 두 번째 요소 만 사용하며 최대 값을 얻습니다. 그러나 최대 튜플의 첫 번째 요소 만 필요합니다. 그래서 우리는 튜플에서 첫 번째 요소 만 가져 오는 fst 함수를 사용합니다.

양자 택일로, 당신은 모두가 올바른 방법이 될 것 같습니다이

import Data.Ord (comparing) 
import Data.List (maximumBy) 
main = print $ fst (maximumBy (comparing snd) [(1, 5), (2, 1)]) 
-- 1 
+0

매우 유용한 답변 ... 최대 사용 건전한 사례 건배 : – Elliot

관련 문제