2017-10-28 232 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

相关问题