튜플 (문자열, Int) 및 Int x의 인수 목록을 takse하고 목록에 따라 최상위 x 튜플을 반환하는 가장 간단한 방법 (또는 haskell에 포함 된 것이있을 수 있습니다)을 수행하는 방법은 무엇입니까? ~ x 값.haskell 정렬
어떤 정렬을해야하는지에 따라 튜플에 필드의 이름 (또는 인덱스)을 3 인수로받는 함수를 작성할 수 있는지 궁금합니다.
매우 일반적인 솔루션을 만드는 가장 좋은 방법은 무엇입니까?
튜플 (문자열, Int) 및 Int x의 인수 목록을 takse하고 목록에 따라 최상위 x 튜플을 반환하는 가장 간단한 방법 (또는 haskell에 포함 된 것이있을 수 있습니다)을 수행하는 방법은 무엇입니까? ~ x 값.haskell 정렬
어떤 정렬을해야하는지에 따라 튜플에 필드의 이름 (또는 인덱스)을 3 인수로받는 함수를 작성할 수 있는지 궁금합니다.
매우 일반적인 솔루션을 만드는 가장 좋은 방법은 무엇입니까?
take x $ sortBy (compare `on` fst) [("asd", 1), ...]
take x
은 정렬 된 목록의 첫 x 항목을 가져옵니다. sortBy
은 첫 번째 인수로 주어진 정렬 함수를 사용하여 두 번째 인수로 주어진 목록을 정렬합니다. (compare `on` fst)
은 각 튜플의 첫 번째 값을 비교합니다. 이 예제에서는 정렬을 위해 각 튜플의 첫 번째 값을 비교합니다. 두 번째 값으로 정렬하려면 fst
을 snd
으로 바꾸십시오.
sortBy
함수는 값을 비교하는 데 사용되는 함수를 정의 할 수 있으므로 매우 일반적입니다. 이 함수는 두 개의 인수를 취하며 LT, EQ 또는 GT 중 하나를 반환해야합니다. compare
함수는 Ord
에서 파생되는 두 개의 인수가 필요합니다. 도우미 함수 on
은 모듈 Data.Function
에서 찾을 수 있습니다. 기능 sortBy
은 모듈 Data.List
에 있습니다.
편집 : 다음은 첫 번째 값을 비교하여 튜플 목록을 정렬하고 결과 목록의 처음 두 튜플을 인쇄하는 완전한 작동 예제입니다. 위 예제의 on
을 내부적으로 무엇을 나타내는 on
을 나타내는 동등한 함수로 바꿨습니다.
import Data.Function
import Data.List
main = print $ mySort [("foo", 1), ("bar", 2), ("baz", 3), ("quux", 4)] 2
mySort list x = take x $ sortBy (\ x y -> compare (fst x) (fst y)) list
편집 : 톰 Lokhorst으로 자신의 의견에서 지적은, 모듈 Data.Ord
에서 함수 comparing
는 on compare
에 대한 더 읽기 대체/바로 가기, 그래서 위의도 sortBy (comparing fst)
로 기록 될 수있다.
'Data.Ord'의'comparison' 함수는'on compare'와 같습니다. 그래서'sortBy (fst 비교)리스트 '라고 쓸 수 있습니다. –
니스, 나는 그걸 몰랐다. – jkramer
'sortBy' 전에'take'하지 않겠습니까? mySort는 잠재적으로 무한한 목록을 취할 수 있습니다. –
나는 당신의 질문이 아마 당신 자신의 호기심에 더 가깝다고 생각하지만, 데이터로 무엇을하고 있습니까? 정렬 된 목록이 실제로 끝내기를 원하는 것입니까? 우리는 더 이상 C 국가의 저수준 배열에있는 요소들을 뒤적 거리지 않고 있으며, haskell은 흥미있는 데이터 유형의 전체 동물원에 쉽게 접근 할 수있게 해줄 것입니다. 흥미로운 데이터 유형은 "정렬 된" 데이터. – jberryman
이유는 Im 학습이 무엇이며 가능성이 무엇인지 알고 싶습니다. 정렬 기능은 모든 사람이 이해할 수 있도록하기 때문에 explenation이 더 쉽습니다. 물론, 임베디드 타입에 대해서 알고, 여전히 배울 점, – gruber