【发布时间】:2017-01-09 09:40:16
【问题描述】:
我在 Kleisli 之上有一个 monad 转换器堆栈,定义为:
type Env = Map[String,Int]
type MyState = List[Int]
type S[A] = EitherT[StateT[WriterT[Kleisli[List,Env,?],String,?],MyState,?], String, A]
我想用以下签名定义一个local 方法:
def localE[A](f: Env => Env)(sa: S[A]): S[A] = ???
有可能吗?
我知道MonadReader中有一个local方法,签名为:
def local[A](f: R => R)(fa: F[A]): F[A]
所以最简单的解决方案是从S 获取隐含的MonadReader,但是,我找不到如何去做。
我的代码的简单 sn-p 如下:
package examples
import cats._, data._
import cats.implicits._
object local {
type Env = Map[String,Int]
type MyState = List[Int]
type S[A] = EitherT[StateT[WriterT[Kleisli[List,Env,?],String,?],MyState,?], String, A]
// The following definition doesn't compile
// implicit lazy val mr = MonadReader[S,Env]
// Modify the environment
def localE[A](f: Env => Env)(sa: S[A]): S[A] = ???
}
【问题讨论】:
标签: scala monads monad-transformers scala-cats