2017-10-28 8 views
6

방금 ​​하스켈을 배우기 시작했습니다. score x에 최대 값이있는 목록에서 x를 찾으려고합니다. 나는 작동하는 snd (maximum [(score x, x) | x <- codes])을 시도했지만 실제로는 함수와 값을 모두 저장하지 않고이 작업을 수행하는 더 빠른 방법이 있는지 궁금해하고있었습니다.하스켈 : f (x)가 최대 인 목록의 x 축

의견을 보내 주셔서 감사합니다.

+2

"저장된"점수에 대해 걱정하지 마십시오. 하스켈과 GHC의 작동 방식은 걱정할 필요가 없습니다. 예를 들어 컴파일 된 프로그램'main = print (maximum [(2 * x, x) | x <- [1..100000000000] :: [Int]])'은 실행하는데 약 10-15 분이 걸릴 것이다. 그래서 작고 일정한 메모리에서, 컴파일러는 코드 나 점수 중 어느 것도 응답을 얻기 위해 유지할 필요가 없다고 결정할 것이기 때문에. –

+1

동일한 점수를 가진 코드의 경우 최대 코드를 선택하여 코드를 선택하지만 'Ord'는 해당 유형에 대해 정의됨을 유의하십시오. 이것은 당신이 원하는 것일 수도 아닐 수도 있습니다. – Carl

+0

'snd. maximumBy (fst 비교). map (score &&& id)'는''Ord'가 아닌 타입에서도 작동합니다. –

답변

7

해결책은 괜찮습니다. 일부 라이브러리의 도움을 원하는 경우에, 당신이, 당신의 코드에 비해 score에 더 많은 통화를 수행 할 것을

maximumBy (comparing score) codes 

주를 사용할 수 있습니다. score이 계산하는 데 비용이 많이 든다면 score을 목록 요소 당 한 번만 계산하므로 접근 방법이 더 좋습니다.

+0

TIL의 '비교'- 정말 고마워요! – AJFarmar

+0

@AJFarmar 소개되기 전에 관용구는''''''''을 비교했다. 이것은 '비교 = 비교 중'이 결국 라이브러리에 추가되는 것이 일반적이었습니다. – chi