Я пытаюсь создать композируемый тип состояния в котах mtl, используя Hlist, и определил 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]
Однако это неявное определение вызывается для разрешения неявного аргумента M
, даже если S2
не является списком HList, а селектор и заменитель не могут разрешить, и тогда он не просматривает импликации cats.mtl
Я попытался определить S2 <:! <HList (и =:! =), Но это никак не помогло. </p>
Тестовый код показан ниже:
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]]
}