我有一个使用cats-free
的FreeMonads玩具示例,我的FunctorTransformer(即解释器(从我的代数(sealed trait StartupActionA[T]
(到Id[A]
似乎需要显式调用asInstanceOf[Id[A]]
。
见 https://github.com/rodoherty1/FreeMonads/blob/master/src/main/scala/io/rob/FreeMonads.scala#L45
根据 Cats 文档,我应该不需要这个显式调用来asInstanceOf[Id[A]]
。
这是我的代数:
sealed trait StartupActionA[A] extends Product with Serializable
case object StartCluster extends StartupActionA[Unit]
case object StartEventActorShard extends StartupActionA[ActorRef]
case class StartKafka(ref: ActorRef) extends StartupActionA[Option[ActorRef]]
这是我的口译员:
object Interpreter extends (StartupActionA ~> Id) {
override def apply[A](fa: StartupActionA[A]): Id[A] = fa match {
case StartCluster =>
println("Starting up the Akka Cluster").asInstanceOf[A]
case StartEventActorShard =>
system.actorOf(Props(new MyActor()), "MyActor").asInstanceOf[A]
case StartKafka(ref) =>
Some(ref).asInstanceOf[A]
}
}
我是否缺少隐式转换或我错误地定义了代数?
你的代数很好,不要被 IDEA 误导。
这是一个不使用 Akka 的小重现,它使用 Scala 2.12.4 和 cats-1.0.0-RC1 编译:
import cats.{Id, ~>}
sealed trait StartupActionA[A] extends Product with Serializable
case object StartCluster extends StartupActionA[Unit]
case object StartEventActorShard extends StartupActionA[String]
case class StartKafka(ref: String) extends StartupActionA[Option[String]]
object Interpreter extends (StartupActionA ~> Id) {
override def apply[A](fa: StartupActionA[A]): Id[A] = fa match {
case StartCluster => ()
case StartEventActorShard => "hello"
case StartKafka(ref) => Some(ref)
}
}
虽然IDEA用红色波浪线大喊大叫。