List 具有重复项的函数列表
假设我有一个列表[=>Int],需要调用所有函数来获得结果列表List 具有重复项的函数列表,list,function,scala,concurrency,List,Function,Scala,Concurrency,假设我有一个列表[=>Int],需要调用所有函数来获得结果列表 def invoke(fs: List[() => Int]): List[Int] = fs map (_()) 如果fs有重复的呢?我可能可以记忆结果,但我需要同时调用这些函数。看起来我需要做一些预处理,以确保每个函数只调用一次 你有什么建议?一般来说,无法知道两个函数是否相等。即使您正在查看同一函数实例的两个副本,它们也可能会调用一些副作用,例如生成一个随机数,因此从某种意义上来说,省略第二个调用是不正确的。在函数可证
def invoke(fs: List[() => Int]): List[Int] = fs map (_())
如果fs有重复的呢?我可能可以记忆结果,但我需要同时调用这些函数。看起来我需要做一些预处理,以确保每个函数只调用一次
你有什么建议?一般来说,无法知道两个函数是否相等。即使您正在查看同一函数实例的两个副本,它们也可能会调用一些副作用,例如生成一个随机数,因此从某种意义上来说,省略第二个调用是不正确的。在函数可证明没有副作用的情况下,JVM可能会自己发现这一点。所以我真的认为你解决了错误的问题 但如果你真的想记忆,我会用scalaz记忆。不同种类的备忘录记录了它们提供的线程安全保证
def execute(fs: List[() => Int]) = {
val m = Memo.mutableHashMapMemo({f: (() => Int) => f()})
fs map m
}
一般来说,无法知道两个函数是否相等。即使您正在查看同一函数实例的两个副本,它们也可能会调用一些副作用,例如生成一个随机数,因此从某种意义上来说,省略第二个调用是不正确的。在函数可证明没有副作用的情况下,JVM可能会自己发现这一点。所以我真的认为你解决了错误的问题 但如果你真的想记忆,我会用scalaz记忆。不同种类的备忘录记录了它们提供的线程安全保证
def execute(fs: List[() => Int]) = {
val m = Memo.mutableHashMapMemo({f: (() => Int) => f()})
fs map m
}
可能正在使用lazy:
如果f1请求失败,并且您处理异常以允许调用链继续,则f1的第一个成功响应将初始化lazy for f1。可能使用lazy:
如果f1请求失败,并且您处理异常以允许调用链继续,则f1的第一个成功响应将初始化lazy for f1。谢谢。我的实际问题有点不同。我有一个请求列表,并使用这些请求同时执行远程调用。为了简单起见,我改变了问题的定义。谢谢你顺便提一下备忘录。我会读到的,谢谢。我的实际问题有点不同。我有一个请求列表,并使用这些请求同时执行远程调用。为了简单起见,我改变了问题的定义。谢谢你顺便提一下备忘录。我会读到的。