我有一个玩具 DSL
case class Logging[A](msg: String, action: A)
case class Persist[A](msg: String, action: A)
type Effect[A] = EitherK[Logging, Persist, A]
我想与一个同样玩具的口译员配对
case class CoLogging[A](run: String => A)
case class CoPersist[A](run: String => A)
type Interp[A] = Tuple2K[CoLogging, CoPersist, A]
这是一个程序示例:
def prog(implicit L: Logs[Effect], P: Persists[Effect]): Free[Effect, Unit] =
P.store("bar") >> L.log("foo")
这是口译员:
def interpretEffect(implicit CL: CoLogs[IO], CP: CoPersists[IO]): Cofree[Interp, IO[Unit]] =
Cofree.unfold(IO.pure(())) { a: IO[Unit] => Tuple2K(CoLogging(CL.coLog(a)), CoPersist(CP.coPersist(a))) }
我已经进行了尽职调查并定义了函子以及注入隐式。编译器抱怨它找不到实例cats.Functor[[A]cats.data.Tuple2K[example.CoLogging,example.CoPersist,A]]
,即使我正在导入cats.data.Tuple2K._
隐式定义的实例。
我看不出我做错了什么,这一定是愚蠢的。你有什么主意吗?所有代码都可以在这个 gist中看到。