2017-12-25 19 views
2

안녕하세요 저는 초보자 인 haskell입니다.하스켈 - 정렬 후 튜플 목록에서 n 개 항목을 가져 오는 방법

[("and",2),("the",2),("cat",1),("dog",1),("rabbit",1)] 
이 나에게 결과를 제공

sortWords = sortBy(flip compare `on` snd) 

: 주파수에 의해 목록을 정렬과 내림차순

[("and",2),("cat",1),("dog",1),("rabbit",1),("the",2)] 

우선 :이 튜플 목록에서 처음 3 개 항목을 얻기 위해 노력하고 있어요

그렇다면 기능을 수행 할 수 있다는 것을 알고 있습니다.

take 3 [("and",2),("the",2),("cat",1),("dog",1),("rabbit",1)] 
그러나 날 [("and",2),("the",2),("cat",1)]

원하는 결과를 제공 1,515,

, 난 sortWords 함수로 take 기능을 통합 할 수있게하려면. 문제는 내가 이것을 시도 할 때 예를 들면 다음과 같습니다.

sortWords = take 3 (sortBy(flip compare `on` snd)) 

이것은 작동하지 않습니다.

기능을 수행 할 수 있도록 다른 사람에게 전달하고 싶지 않으므로 이상적으로는 sortWords을 종료 기능으로 유지하고 싶습니다. 해결책이 될 수있는 sortWords을 호출하기 전에 take을 수행 할 방법이 있다면, 그러나 나는 또한 이것을 시도하고 찍은 단어가 먼저 정렬되지 않으므로 내가 원하는 결과를주지 않는다는 것을 알았습니다.

여기서 문제는 sortBy (flip compare `on` snd)하지 튜플의 목록입니다 당신에게

답변

7

감사, 그것은 입력으로 튜플의리스트를 취하고 튜플의리스트를 반환하는 함수이다.

여기
sortWords :: Ord b => [(a,b)] -> [(a,b)] 
sortWords = take 3 . sortBy (flip compare `on` snd) 

우리는 따라서 첫 번째 입력에 sortBy (flip compare `on` snd)를 적용한 것, 그리고, 우리는 그 함수의 출력에 take 3를 적용한 것이다

우리는 함수의 합성 오퍼레이터 (.) :: (b -> c) -> (a -> b) -> a -> c를 사용할 수있다.

+0

효과가있었습니다. 고맙습니다 :) – k1r4n