【发布时间】:2018-06-15 23:14:11
【问题描述】:
我正在尝试使用 Hlist 在猫 mtl 中创建可组合的状态类型,并定义了 MonadState 如下
implicit def hlistStateMonad[M[_], S <: HList, S2]
(implicit S:Selector[S, S2], R:Replacer[S, S2, S2], M:MonadState[M, S]):MonadState[M, S2]
但是,即使S2 不是 HList,并且 Selector 和 Replacer 无法解析,它也不会在cats.mtl 中查找隐式 arg
我尝试定义 S2 <: hlist>
可测试代码如下:
object Test {
implicit def hlistStateMonad[M[_], S <: HList, S2](implicit S:Selector[S, S2], R:Replacer[S, S2, S2], M:MonadState[M, S]):MonadState[M, S2] =
new MonadState[M, S2] {
val monad: Monad[M] = M.monad
def inspect[A](f: S2 => A):M[A] =
M.inspect(s => f(S(s)))
def modify(f: S2 => S2):M[Unit] =
M.modify(s => R(s, f(S(s))).asInstanceOf[(S2, S)]._2)
def get:M[S2] =
M.inspect(S.apply)
def set(s2: S2): M[Unit] =
M.modify(s => R(s, s2).asInstanceOf[(S2, S)]._2)
}
}
test("Monad state resolution with HList") {
type M[V] = State[Int :: String :: HNil, V]
import cats.mtl.instances.all._
import Test._
val m = implicitly[MonadState[M, Int]]
}
【问题讨论】:
标签: scala shapeless scala-cats