我有一个使用cats-free
的FreeMonads玩具示例,我的代数(sealed trait StartupActionA[T]
)到Id[A]
的FunctorTransformer(即解释器)似乎需要并显式调用{{1} }}
请参阅https://github.com/rodoherty1/FreeMonads/blob/master/src/main/scala/io/rob/FreeMonads.scala#L45
根据Cats documentation,我不应该明确调用asInstanceOf[Id[A]]
。
这是我的代数:
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]]
我错过了隐式转换,还是我错误地定义了代数?
答案 0 :(得分:1)
你的代数很好,不要被IDEA误导。
这是一个小的重现,没有使用Akka,它与Scala 2.12.4和cat-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大喊红色曲线。