2017-10-28 239 views
6

我剛開始學習Haskell。我試圖在列表中找到一個x,其中score x具有最大值。我嘗試了snd (maximum [(score x, x) | x <- codes])這是可行的,但我想知道是否有更快的方法來做到這一點,而沒有實際存儲函數和值。Haskell:f(x)最大的列表中的x x

感謝您的任何建議!

+2

不要擔心被存儲的分數 - Haskell和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

您的解決方案很好。如果你想要一些圖書館的幫助下,你可以使用

maximumBy (comparing score) codes 

注意這一點,比起你的代碼,將執行多次調用score。如果score計算起來很昂貴,那麼您的方法會更好,因爲它只會爲每個列表元素計算score一次。

+0

「比較」的TIL - 非常感謝! – AJFarmar

+0

@AJFarmar在它被引入之前,這個習慣用法是''比較''得分''。這很常見,所以'比較=比較'最終被添加到庫中。 – chi

相關問題