通过 scalaz 中的 Kleisli 箭头编写函数时,无法在 Coyoneda 上找到 Free Monads 的 Bind 实例
Cannot find Bind instances for Free Monads over Coyoneda when composing functions via Kleisli arrows in scalaz
提前感谢您的帮助
我尝试通过 Kleisli 箭头组合 2 个函数。这些函数接受 String 并生成 FreeC。 kleisli 箭头的创建没有问题,但编译器抱怨找不到。为了简单起见,我将删除一些代码:
import scalaz._
import Scalaz._
import Free.FreeC
import Free._
import Kleisli._
trait AppCompose {
def lift[F[_], G[_], A](fa: F[A])(implicit I: Inject[F, G]): FreeC[G, A] =
Free.liftFC(I.inj(fa))
}
object BigBrother {
sealed trait Sensor[A]
case class Log(log: String) extends Sensor[Unit]
case class Filter(log: String) extends Sensor[String]
case class Secure(log: String) extends Sensor[String]
}
import BigBrother.Sensor
class BigBrother[F[_]](implicit I: Inject[Sensor,F]) extends AppCompose {
import BigBrother._
type FreeString[A] = FreeC[F,String]
def log(log: String) = lift(Log(log))
def filter(log: String) = lift(Filter(log))
def secure(log: String) = lift(Secure(log))
def filterAndSecure(phrase: String) = for {
f <- filter(phrase)
s <- secure(f)
} yield s
// kleisli composition attempt - alternative to filterAndSecure
val fk = kleisli[FreeString, String, String](filter _)
val sk = kleisli[FreeString, String, String](secure _)
val fAndS = fk >=> sk // this is where we have a compilation issue
}
出于某种原因,我得到的是这个编译错误:
could not find implicit value for parameter b: scalaz.Bind[FreeString]
[error] val fAndS = sk >=> fk
感觉应该解决隐式问题,因为 FreeC 在实现 Bind 特性的 monad 实例中,我正在通过导入导入所有 Free 隐式实例 Free._
我在这里错过了什么?
提前致谢!
感谢特拉维斯的帮助。错误的类型声明实际上是罪魁祸首之一。在 scalaz 社区通过 google 组提供的一些帮助下,这里的一些修补就是答案:
class BigBrother[F[_]](implicit I: Inject[Sensor,F]) extends AppCompose {
import BigBrother._
def log(log: String) = lift(Log(log))
def filter(log: String) = lift(Filter(log))
def secure(log: String) = lift(Secure(log))
def filterAndSecure(phrase: String) = for {
f <- filter(phrase)
s <- secure(f)
} yield s
type CoyoF[A] = Coyoneda[F, A]
type FreeCoF[A] = Free[CoyoF,A]
implicit val MonadFreeSensor = Free.freeMonad[FreeCoF]
// kleisli composition attempt - alternative to filterAndSecure
val fk = kleisli[FreeCoF, String, String](filter _)
val sk = kleisli[FreeCoF, String, String](secure _)
val fAndS = fk >=> sk
}
key 是正确的类型声明并为 FreeCoF 提供类型 class monad 实例 implicit val MonadFreeSensor = Free.freeMonad[FreeCoF]
提前感谢您的帮助
我尝试通过 Kleisli 箭头组合 2 个函数。这些函数接受 String 并生成 FreeC。 kleisli 箭头的创建没有问题,但编译器抱怨找不到。为了简单起见,我将删除一些代码:
import scalaz._
import Scalaz._
import Free.FreeC
import Free._
import Kleisli._
trait AppCompose {
def lift[F[_], G[_], A](fa: F[A])(implicit I: Inject[F, G]): FreeC[G, A] =
Free.liftFC(I.inj(fa))
}
object BigBrother {
sealed trait Sensor[A]
case class Log(log: String) extends Sensor[Unit]
case class Filter(log: String) extends Sensor[String]
case class Secure(log: String) extends Sensor[String]
}
import BigBrother.Sensor
class BigBrother[F[_]](implicit I: Inject[Sensor,F]) extends AppCompose {
import BigBrother._
type FreeString[A] = FreeC[F,String]
def log(log: String) = lift(Log(log))
def filter(log: String) = lift(Filter(log))
def secure(log: String) = lift(Secure(log))
def filterAndSecure(phrase: String) = for {
f <- filter(phrase)
s <- secure(f)
} yield s
// kleisli composition attempt - alternative to filterAndSecure
val fk = kleisli[FreeString, String, String](filter _)
val sk = kleisli[FreeString, String, String](secure _)
val fAndS = fk >=> sk // this is where we have a compilation issue
}
出于某种原因,我得到的是这个编译错误:
could not find implicit value for parameter b: scalaz.Bind[FreeString]
[error] val fAndS = sk >=> fk
感觉应该解决隐式问题,因为 FreeC 在实现 Bind 特性的 monad 实例中,我正在通过导入导入所有 Free 隐式实例 Free._
我在这里错过了什么?
提前致谢!
感谢特拉维斯的帮助。错误的类型声明实际上是罪魁祸首之一。在 scalaz 社区通过 google 组提供的一些帮助下,这里的一些修补就是答案:
class BigBrother[F[_]](implicit I: Inject[Sensor,F]) extends AppCompose {
import BigBrother._
def log(log: String) = lift(Log(log))
def filter(log: String) = lift(Filter(log))
def secure(log: String) = lift(Secure(log))
def filterAndSecure(phrase: String) = for {
f <- filter(phrase)
s <- secure(f)
} yield s
type CoyoF[A] = Coyoneda[F, A]
type FreeCoF[A] = Free[CoyoF,A]
implicit val MonadFreeSensor = Free.freeMonad[FreeCoF]
// kleisli composition attempt - alternative to filterAndSecure
val fk = kleisli[FreeCoF, String, String](filter _)
val sk = kleisli[FreeCoF, String, String](secure _)
val fAndS = fk >=> sk
}
key 是正确的类型声明并为 FreeCoF 提供类型 class monad 实例 implicit val MonadFreeSensor = Free.freeMonad[FreeCoF]