如何将 kleisli 与条件结合起来

How to combine a kleisli with a conditional

给定一个现有的方法 f

def f : Kleisli[Future, Context, Seq[Tip]] = ???

我需要一个根据条件使用 f 的组合器。 这是我当前的实现:

def g(selected: Seq[Tip]) = 
    if (selected.isEmpty) 
      f 
    else 
      Kleisli[Future, Context, Seq[Tip]] { _ => Future.successful(selected.maxsBy(_.creationDate))}

有没有更好的方法?

单个值提升为Kleisli的部分非常冗长)

如果您正在寻找一种更短的方式将 Seq[Tip] 提升到 Kleisli:您可以使用 askmap :

import scalaz.Kleisli
import scalaz.std.scalaFuture._
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global

Kleisli.ask[Future, Context] map ( _ => selected.maxsBy(_.creationDate))

您还可以将 Context => Seq[Tip] 转换为您的 Kleisli :

import scalaz.syntax.std.function1._

((ctx: Context) => selected.maxsBy(_.creationDate)).kleisli[Future]