Scala Cats FreeMonad - 为什么我的翻译需要asInstanceOf [Id [A]]?

时间:2018-01-07 15:40:31

标签: scala scala-cats free-monad

我有一个使用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]]

我错过了隐式转换,还是我错误地定义了代数?

1 个答案:

答案 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大喊红色曲线。