Ale*_*ndr 3 scala reader-monad scala-cats
type MapReaderOrOption[A] = ReaderT[Option, Map[String,String], A]
Run Code Online (Sandbox Code Playgroud)
我可以从创建它ReaderT.apply:
def f:MapReaderOrOption[Int] = ReaderT(_ => Option(10))
Run Code Online (Sandbox Code Playgroud)
从A类型通过类型丰富和纯方法:
import cats.Applicative
import cats.syntax.int._
def f:MapReaderOrOption[Int] = 10.pure[MapReaderOrOption]
Run Code Online (Sandbox Code Playgroud)
我想找到类似的东西。每次使用ReaderT(..)都不那么方便。当然,我可以创建一个辅助方法。问题是,还有其他选择吗?
预期类似:
def f:MapReaderOrOption[Int] = Option(10).asReaderT[MapReaderOrOption]
Run Code Online (Sandbox Code Playgroud)
在整个库中始终调用将an F[A]并将其提升HK[F, A]为某种更高类型的构造的HK方法liftF。
在您的情况下,它将为Kleisli.liftF,因为ReaderT它只是以下项的别名Kleisli:
import cats.data.ReaderT
import cats.data.Kleisli.liftF
type MapReaderOpt[A] = ReaderT[Option, Map[String, String], A]
val x: MapReaderOpt[Int] = liftF(Option(42))
Run Code Online (Sandbox Code Playgroud)
如果liftF看起来不太明确,您仍可以{liftF => liftToReaderT}在重命名导入期间将其重命名为。
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
Run Code Online (Sandbox Code Playgroud)
或在f未明确提供类型的情况下,您需要定义K参数。
def f = Option(10).asReaderT[Map[String,String]]
Run Code Online (Sandbox Code Playgroud)
因此,现在f将for的类型推断为ReaderT[Option, Map[String,String], Int]。我认为您在这种情况下甚至不需要类型别名。
或另一种选择
def f = Option(10).asReaderT:MapReaderOrOption[Int]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
103 次 |
| 最近记录: |