6

Po ponad roku kłótni umysłowych, w końcu rozumiem Haskella na tyle dobrze, aby uznać go za główny język dla większości moich ogólnych potrzeb programistycznych. Absolutnie to uwielbiam.Funkcjonalne porównywanie zestawów danych ze sobą raz z Haskellem

Ale wciąż zmagam się z robieniem bardzo konkretnych operacji w sposób funkcjonalny.

Uproszczony przykład:

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

Chciałbym porównać te wpisy do siebie. W języku takim jak C lub Python prawdopodobnie utworzyłbym skomplikowaną pętlę, ale nie jestem pewien, które podejście (mapa, składanie, zrozumienie listy?) Byłoby najlepsze lub najbardziej wydajne z językiem funkcjonalnym.

Oto przykładowy kod zacząłem pracować na:

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

Predykat utrzymuje listowych z porównując dane z siebie, ale funkcja ta jest bardzo skuteczna, ponieważ porównuje wpisy, które zostały już porównywane. Na przykład. Porówna Boba z Megan, a następnie porówna Megan z Bobem.

Wszelkie porady dotyczące rozwiązania tego problemu byłyby bardzo mile widziane.

+0

Mówisz, że chcesz je porównać, ale nie to, co chcesz zrobić z wynikiem porównania. Z twojej próbki wydaje się, że chcesz spojrzeć na każdy wybór dwóch różnych elementów z listy. Czy to to? –

+0

Tak, ale nie "do tyłu". Chciałbym porównać Boba z Megan, Boba z Frankiem, Boba z Jane, a potem Megan z Frankiem, Megan z Jane, a potem z Frankiem z Jane (myślę, że obejmuje wszystkie kombinacje). Wygląda to na coś, co można zrobić z krotnie, ale nie jestem pewien. –

Odpowiedz

8

Jeśli zamawiasz swój typ danych, możesz po prostu użyć x < y zamiast x /= y.

Innym podejściem jest użycie tails uniknąć porównywania elementów w tej samej pozycji:

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

Ma to wpływ tylko zbierając przedmioty y które występują po x na pierwotnej liście. Jeśli twoja lista zawiera duplikaty, zechcesz ją połączyć z wcześniejszym filtrowaniem jawnym.

+0

OP wydaje się chcieć spojrzeć na wszystkie pary, ignorując kolejność, więc nie sądzę, że sortowanie pomaga - wydaje się, że jest to problem koniecznie n ** 2. +1 za sugestię ogonów, co według mnie jest właściwą odpowiedzią. –

+0

@JameySharp: Tak, miałem trochę bzika mózgu na tym. Już usunięto tę część :) – hammar

+0

Takie zwięzłe rozwiązanie! Dziękuję bardzo za poświęcony czas i pomoc. –

Powiązane problemy