Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 具有重复项的函数列表_List_Function_Scala_Concurrency - Fatal编程技术网

List 具有重复项的函数列表

List 具有重复项的函数列表,list,function,scala,concurrency,List,Function,Scala,Concurrency,假设我有一个列表[=>Int],需要调用所有函数来获得结果列表 def invoke(fs: List[() => Int]): List[Int] = fs map (_()) 如果fs有重复的呢?我可能可以记忆结果,但我需要同时调用这些函数。看起来我需要做一些预处理,以确保每个函数只调用一次 你有什么建议?一般来说,无法知道两个函数是否相等。即使您正在查看同一函数实例的两个副本,它们也可能会调用一些副作用,例如生成一个随机数,因此从某种意义上来说,省略第二个调用是不正确的。在函数可证

假设我有一个列表[=>Int],需要调用所有函数来获得结果列表

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。

谢谢。我的实际问题有点不同。我有一个请求列表,并使用这些请求同时执行远程调用。为了简单起见,我改变了问题的定义。谢谢你顺便提一下备忘录。我会读到的,谢谢。我的实际问题有点不同。我有一个请求列表,并使用这些请求同时执行远程调用。为了简单起见,我改变了问题的定义。谢谢你顺便提一下备忘录。我会读到的。