2

次の Finagle サービスについて考えてみましょう。これは、型システムを通じて、要求が正しい型の応答になることを保証します。

import com.twitter.finagle.Service
import com.twitter.util.Future
import scala.language.higherKinds

sealed abstract class Request[+T] {
  type Response[X]
}

case class Enqueue[+T](value: T) extends Request[T] {
  case object OK
  override type Response[X] = OK.type
}

case object Dequeue extends Request[Nothing] {
  case class Value[+T](value: T)
  override type Response[X] = Value[X]
}

class Queue[T] extends Service[Request[T], Request[T]#Response[T]] {
  override def apply(request: Request[T]): Future[request.Response[T]] = ???
}

最後の 3 行でRequest[T]#Responseandrequest.Responseの代わりにRequest[T]#Response[T]and と言えたらいいのにと思います。request.Response[T]

私の試みは、さらに間接性を追加することでした:

sealed abstract class Request[+T] {
  protected type response[+X]
  final type Response = response[T]
}

しかし、これにより共変型Tが不変の位置に現れました。

これを行うことはまったく可能ですか?

4

0 に答える 0