列表中使得f(x)最大的x是什么?

6

我正在尝试在列表中查找一个 x,它的 score x 值最大。我尝试了 snd (maximum [(score x, x) | x <- codes]) 这个方法可以工作,但我想知道是否有更快的方法来做到这一点,而不实际存储函数和值。


2
不用担心分数会被“存储”-- Haskell 和 GHC 的工作方式不会这样。例如,编译后的程序 main = print (maximum [(2*x, x) | x <- [1..100000000000] :: [Int]]) 可能需要大约 10-15 分钟才能运行,但由于编译器将确定代码和分数都不需要保留以获得答案,因此它将在小而恒定的内存中运行。 - K. A. Buhr
1
请注意,如果有任何代码具有相同的分数,则会通过选择最大的代码来在它们之间进行选择,但是对于该类型,Ord已经定义。这可能是您想要的,也可能不是。 - Carl
snd . maximumBy (comparing fst) . map (score &&& id) 对于非Ord类型也适用。 - Will Ness
1个回答

7
您的解决方案很好。如果您需要一些库的帮助,可以使用:
maximumBy (comparing score) codes

请注意,与您的代码相比,这段代码将执行更多次 score 的调用。如果计算 score 的成本很高,那么您的方法更好,因为它只会针对列表元素计算一次 score

在引入它之前,这个习语是“compare on score”。这是如此常见,以至于最终将“comparing = on compare”添加到库中。 - chi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接