gpt4 book ai didi

scala - 折叠过程中的中间值?

转载 作者:行者123 更新时间:2023-12-01 21:38:30 25 4
gpt4 key购买 nike

我有一个对象集合

case class Record(value: Whatever)
val list: List[Record]

并希望选择排名最好的

list.foldLeft(list.head) { (best, current) =>
if (rank(current.value) > rank(best.value)) {
current
} else {
best
}
}

让我们假设 rank 是昂贵的并且最好不要在同一个对象上调用两次。我有哪些选择?

我可以折叠到元组 (rank, record) 但这可能意味着在迭代期间创建辅助对象。我应该担心开销吗?或者更确切地说

  1. 如何在 Scala 中有效地实现这一点?

  2. 问题的正确“功能” View 是什么?

最佳答案

如果您的情况是不可避免地要对相同的对象重复进行昂贵的计算,您可以尝试内存。

// memoize this function (arity 1)
def memo[A,R](f :A => R): A => R =
new collection.mutable.WeakHashMap[A,R] {
override def apply(a: A) = getOrElseUpdate(a,f(a))
}

// rankM is a memoized Record => Rank function
val rankM = memo{ r:Record => rank(r.value) }

当您希望 Map 在内存受限的环境中“忘记”很少访问的键时,有时会使用 WeakHashMap

关于scala - 折叠过程中的中间值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61674271/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com