【发布时间】:2014-02-27 17:28:35
【问题描述】:
我有一个方法:
def pollAll[T, O](orchestrators :Seq[O], poll :(O)=>Future[T])
(implicit reduce: (T, T) => T) :Future[T] =
(Future sequence orchestrators.map(poll(_))).map(res => res.reduce(reduce))
现在,假设我有一个返回 Future[Seq[A]] 的投票。是否有可能为reduce 参数提供一个通用的隐式值,它将任何两个具有共同元素类型的序列连接起来?像这样的:
implicit def reduceSeq[T] = (s1 :Seq[T], s2 :Seq[T]) => s1 ++ s2
上面的不行,因为隐式方法用于隐式转换,在查找隐式参数时不考虑其结果。
【问题讨论】:
-
如果 T 不是 Seq 怎么办?你不会错过 T 上的类型吗?
-
好吧,当然,如果 pollAll 中的 T 不是 Seq,那么隐式参数将没有任何值,除非我定义了一个特定的参数。
-
方法调用 "pollAll(List.empty[Int], (i:Int) => future(Seq(i)))" 与您的隐式声明编译对我来说没有任何错误。我在这里错过了什么吗?
-
如果我尝试运行
pollAll(orchestrators, poll)(其中 orchestrators :Seq[Orchestrator]`,编译器会抱怨找不到 reduce 参数的隐式值。这是正确的,因为隐式方法仅用于隐式转换,而不是作为默认参数的提供者。