2017-10-28 19 views
6

Haskell'i yeni öğrenmeye başladım. score x'un en yüksek değere sahip olduğu bir listede x bulmaya çalışıyorum. Çalıştığım snd (maximum [(score x, x) | x <- codes])'u denedim, ancak hem işlevi hem de değeri saklamaksızın bunu yapmanın daha hızlı bir yolu olup olmadığını merak ediyordum.Haskell: f (x) 'nin maksimum olduğu listede x

Önerileriniz için teşekkürler!

+2

Haskell ve GHC çalışma şekilleri - "saklanan" puanlar konusunda endişelenmeyin, olmayacaklar. Örneğin, derlenmiş program 'main = print (maksimum [(2 x x, x) | x <- [1..100000000000] :: [Int]])' koşmak için yaklaşık 10-15 dakika sürebilir ancak böylece küçük, sabit bellekte, derleyici cevabı almak için ne kodların ne de puanların tutulması gerektiğini belirleyecektir. –

+1

Herhangi bir kod aynı puana sahipse, bunların maksimum kodu seçerek aralarında seçim yapılacağını unutmayın, ancak 'Ord' bu tür için tanımlanmıştır. Bu senin istediğin gibi olabilir ya da olmayabilir. – Carl

+0

'snd. maksimumBy (fst ile karşılaştırarak). map (score &&& id) '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'works works works works works works works works works works works works works works works works works works works works works works works works –

cevap

7

Çözümünüz gayet iyi. Bazı kütüphane yardımı istiyorsanız, bu sizin koduna göre score daha fazla arama sonucu vermesi

maximumBy (comparing score) codes 

Not kullanabilirsiniz. score hesaplanması pahalıysa, yaklaşımınız score'u yalnızca liste öğesi başına bir kez hesaplayacağından daha iyidir.

+0

"Karşılaştırma" TIL - çok teşekkür ederim! – AJFarmar

+0

@AJFarmar Tanıtılmadan önce, deyim '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ile karşılaştırın. Bu o kadar yaygındı ki 'karşılaştırmak = karşılaştırmak' kütüphanelere sonunda eklenmişti. – chi