Scala 是否可以像隐式[Monoid[A[B]]那样隐式地将多个类型参数传递给.mappend?
假设我想隐式使用来简化代码的外观,并且我正在编写一个函数,该函数需要为其中一个参数使用一个Monoid实例,但该Monoid位于容器类型上,例如a[B]。例如:Scala 是否可以像隐式[Monoid[A[B]]那样隐式地将多个类型参数传递给.mappend?,scala,Scala,假设我想隐式使用来简化代码的外观,并且我正在编写一个函数,该函数需要为其中一个参数使用一个Monoid实例,但该Monoid位于容器类型上,例如a[B]。例如: trait Monoid[A] { def mappend(a1: A, a2: A): A def mzero: A } implicit def futureOfListMonoid[A] = new Monoid[Future[List[A]]] { def mappend(a1: Futur
trait Monoid[A] {
def mappend(a1: A, a2: A): A
def mzero: A
}
implicit def futureOfListMonoid[A] = new Monoid[Future[List[A]]] {
def mappend(a1: Future[List[A]], a2: Future[List[A]]) = {
for {
v1 <- a1
v2 <- a2
} yield (v1 ++ v2)
}
def mzero = Future.successful(Nil)
}
有没有一种方法可以不使用隐式参数就实现这一点?我知道这种方法可以实现
编辑以包含一个指向codereview.stackexchange的链接更复杂的示例:为遇到此类问题的任何其他人提供有关上下文边界更复杂用法的材料的链接,并进行自我回答 可以将类型声明为具有多个上下文边界: 但是,如果类型本身具有多个参数,您可能无法使用上下文绑定: 但是,通过将类型别名与更高种类的类型一起使用,您可以创建该类型接受类型参数的上下文边界,至少在某些情况下:
如果我错了或过时了,或者如果Scala更新了对该功能的更多支持,请纠正我。这些都是合成的,您为Future[A]编写了一个实例,其中A有一个幺半群实例,为List[A]编写了一个实例,其中A是任何旧的A,您为Future[List[A]编写了一个实例免费。这很有意思。我似乎仍然无法让隐式方法发挥作用,尽管仍然有人抱怨在不应该使用类型参数时使用类型参数,或者在需要时丢失类型参数,这取决于我正在尝试的潜在解决方案。我不确定你在尝试什么,但不要以创建Monoid[未来]的隐式方法为目标[List[A]]]直接。有一个def-FutureMoneoid[A:Monoid]:Monoid[Future[A]]和一个def-Listmoneoid[A]:Monoid[List[A]]。编辑以包括更复杂的示例,请注意,我不确定如何使用FutureMoneoid[A:Monoid]包含多个类型的语法,例如Monoid和Traversable。如果您想查看完整代码,我将其发布在codereview.stackexchange上,请参见上面的链接。
// this compiles and works, but isn't good enough
// for my more complicated example, which need to
// specify that A is a container type
def myAppend[A: Monoid](a1: A, a2: A): A = {
implicitly[Monoid[A]].mappend(a1, a2)
}
// this is roughly what I want, but it doesn't compile
def myAppend[A[_]: Monoid, B](a1: A[B], a2: A[B]): A[B] = {
implicitly[Monoid[A[B]]].mappend(a1, a2)
}