type MapReaderOrOption[A] = ReaderT[Option, Map[String,String], A]
我可以从
ReaderT.apply
创建它:def f:MapReaderOrOption[Int] = ReaderT(_ => Option(10))
从A类型通过类型丰富和纯方法:
import cats.Applicative
import cats.syntax.int._
def f:MapReaderOrOption[Int] = 10.pure[MapReaderOrOption]
我想找到类似的东西。每次使用ReaderT(..)都不那么方便。当然,我可以创建一个辅助方法。问题是,还有其他选择吗?
预期类似:
def f:MapReaderOrOption[Int] = Option(10).asReaderT[MapReaderOrOption]
最佳答案
type MapReaderOrOption[A] = ReaderT[Option, Map[String,String], A]
implicit class toReader[F[_],T](f: F[T]) {
def asReaderT[K] = ReaderT[F,K,T](_ => f)
}
def f:MapReaderOrOption[Int] = Option(10).asReaderT
否则,如果未明确提供
f
类型,则需要定义K
参数。def f = Option(10).asReaderT[Map[String,String]]
因此,现在将
f
的类型推断为ReaderT[Option, Map[String,String], Int]
。我认为您在这种情况下甚至不需要类型别名。或另一种选择
def f = Option(10).asReaderT:MapReaderOrOption[Int]