6

1 년이 넘는 정신적 논쟁 끝에 마침내 하스켈을 제 프로그래밍 언어의 기본 프로그래밍 언어로 간주 할 정도로 충분히 이해할 수있었습니다. 나는 그것을 절대적으로 좋아한다.Haskell과 기능적으로 서로 데이터 세트를 비교하십시오.

하지만 기능적인 방식으로 매우 구체적인 작업을 수행하는 데 여전히 어려움을 겪고 있습니다.

단순화 된 예 :

Set = [("Bob", 10), ("Megan", 7), ("Frank", 2), ("Jane", 11)] 

나는 서로 이러한 항목을 비교하고 싶습니다. C 나 Python과 같은 언어를 사용하면 아마도 복잡한 루프를 만들지 만, 어떤 접근법 (지도, 배, 목록 이해력)이 함수형 언어를 사용하는 것이 가장 좋고 효율적인지는 확실치 않습니다. 여기

코드의 샘플 내가 작업을 시작이다 :

run xs = [ someAlgorithm (snd x) (snd y) | x <- xs, y <- xs, x /= y ] 

술어 자체로 항목을 비교 한 지능형리스트를 유지하지만 이미왔다 항목을 비교하기 때문에 기능은 매우 효율적이지 않다 비교. 예를 들어. Bob과 Megan을 비교 한 다음 Megan과 Bob을 비교합니다.

이 문제를 해결하는 방법에 대한 조언은 크게 감사하겠습니다. 당신이 당신의 데이터 유형에 대한 주문이있는 경우

+0

당신은 비교하고 싶지만 비교 결과로하고 싶은 것을 말하는 것은 아닙니다. 귀하의 견본에서 그것은 당신이 목록에서 두 개의 다른 요소의 모든 선택을보고 싶다는 것 같습니다. 그게 다야? –

+0

예, "역방향"선택은 아닙니다. 밥과 메간, 밥과 프랭크, 밥과 제인 그리고 메간과 프랭크, 메간과 제인 그리고 프랭크와 제인을 비교해보고 싶습니다. 이것은 접을 수있는 것처럼 보이지만 확실하지 않습니다. –

답변

8

, 당신은 단지 x < y 대신 x /= y 사용할 수 있습니다.

[ ... | (x:ys) <- tails xs, y <- ys] 

이 원래리스트 x 후에 만 ​​발생 따기 y 항목의 효과를 갖는다 :

다른 방법은 동일한 위치에있는 요소를 비교 피할 tails을 사용하는 것이다. 목록에 중복 항목이 포함되어 있으면 이전에 사용한 명시 적 필터링과 결합해야합니다.

+0

OP는 순서를 무시하고 모든 쌍을보고 싶기 때문에 정렬이 도움이된다고 생각하지 않습니다. 필연적으로 n ** 2 문제처럼 보입니다. + 꼬리 제안에 대한 +1, 나는 옳은 대답이라고 생각합니다. –

+0

@JameySharp : 네,저기서 방귀 소리가났습니다. 이미 그 부분을 제거했습니다 :) – hammar

+0

이러한 간결한 솔루션! 시간을내어 도와 주셔서 대단히 감사합니다. –

관련 문제