gpt4 book ai didi

Scala:返回类型 Seq[A] 或 Future[Seq[A]] 的泛型

转载 作者:行者123 更新时间:2023-12-02 17:59:09 25 4
gpt4 key购买 nike

问题

我有两个类,如下所示:

class Now {
def do[A](f: Int => A): Seq[A]
}

class Later {
def do[A](f: Int => A): Future[Seq[A]]
}

这两个类之间的唯一区别是 Now 返回一个 Seq,Later 返回一个 Future Seq。我希望这两个类共享相同的接口(interface)

我尝试过的

考虑到 Seq 和 Future[Seq] 应该只需要一个类型参数,这似乎非常适合更高种类的类型。

trait Do[F[_]] {
def do[A](f: Int => A): F[A]
}

// Compiles
class Now extends Do[Seq] {
def do[A](f: Int => A): Seq[A]
}

// Does not compile. "type Seq takes type parameters" and
// "scala.concurrent.Future[<error>] takes no type parameters, expected: one"
class Later extends Do[Future[Seq]] {
def do[A](f: Int => A): Future[Seq[A]]
}

我是否错误地使用了更高级的类型?我是否错误地提供了 Future[Seq]?有没有办法让现在和以后共享相同的界面?

最佳答案

您需要类型组合:

trait Composition[F[_], G[_]] { type T[A] = F[G[A]] }

class Later extends Do[Composition[Future, Seq]#T] {
def do[A](f: Int => A): Future[Seq[A]]
}

或者如果您只需要在这个地方

class Later extends Do[({ type T[A] = Future[Seq[A]] })#T] {
def do[A](f: Int => A): Future[Seq[A]]
}

参见scalaz (我本可以发誓它包含一般类型组合,但显然不是。)

关于Scala:返回类型 Seq[A] 或 Future[Seq[A]] 的泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21102786/

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