【发布时间】:2018-12-26 22:40:57
【问题描述】:
我有以下方法:
trait Tr[F[_]]{
def getSet(): F[Set[String]]
def checksum(): F[Long]
def value(): F[String]
def doRun(v: String, c: Long, s: Set[String]): F[Unit]
}
现在我想写以下内容以供理解:
import cats._
import cats.data.OptionT
import cats.implicits._
def fcmprhn[F[_]: Monad](F: Tr[F]): OptionT[F, Unit] =
for {
set <- OptionT {
F.getSet() map { s =>
if(s.nonEmpty) Some(s) else None
}
}
checksum <- OptionT.liftF(F.checksum())
v <- OptionT.liftF(F.value())
_ <- OptionT.liftF(F.doRun(v, checksum, set))
//can be lots of OptionT.liftF here
} yield ()
如您所见,OptionT 样板文件太多。有没有办法避免它?
我想我可以使用F ~> OptionT[F, ?]。你能提出一些建议吗?
【问题讨论】:
-
@AndreyTyukin 2)他们没有,但他们实际上需要稍后执行有效的计算。已添加
标签: scala functional-programming monads scalaz scala-cats