2017-10-28 81 views
6

Właśnie zacząłem uczyć się Haskella. Próbuję znaleźć x na liście, dla której score x ma maksymalną wartość. Próbowałem snd (maximum [(score x, x) | x <- codes]), który działa, ale zastanawiałem się, czy był szybszy sposób to zrobić, bez faktycznego przechowywania zarówno funkcji i wartości.Haskell: x na liście dla której f (x) jest maksymalna

Dzięki za wszelkie sugestie!

+2

Nie przejmuj się, że wyniki są "przechowywane" - tak jak Haskell i GHC działają, nie będą. Na przykład skompilowany program 'main = print (maksymalnie [(2 * x, x) | x <- [1..100000000000] :: [Int]])' może potrwać około 10-15 minut, ale będzie więc w małej, stałej pamięci, ponieważ kompilator ustali, że ani kody, ani wyniki nie muszą być przechowywane, aby uzyskać odpowiedź. –

+1

Należy pamiętać, że jeśli kody mają taki sam wynik, wybierze się między nimi, wybierając maksymalny kod, jednak dla tego typu jest zdefiniowane słowo "Ord". To może, ale nie musi być to, co chcesz. – Carl

+0

'snd. maximumBy (porównując fst). map (score && & id) 'działa również dla typów innych niż" Ołe ". –

Odpowiedz

7

Twoje rozwiązanie jest w porządku. Jeśli chcesz jakąś pomoc biblioteki, można użyć

maximumBy (comparing score) codes 

Zauważ, że to, w porównaniu do kodu, który wykona więcej połączeń do score. Jeśli score jest kosztowny do obliczenia, twoje podejście jest lepsze, ponieważ będzie obliczać score tylko raz na element listy.

+0

TIL "porównywania" - dziękuję bardzo! – AJFarmar

+0

@AJFarmar Przed wprowadzeniem, idiomem było '' porównaj 'na' wynik''. Było to tak powszechne, że "porównywanie = przy porównaniu" zostało ostatecznie dodane do bibliotek. – chi