2016-04-11 47 views
0

鑑於現有方法相結合˚F如何將kleisli與條件

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

我需要將使用f取決於條件一個組合子。 這裏是我目前的impl:

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

有沒有更好的方法?

(的一部分電梯單個值成Kleisli相當冗長)

回答

1

如果你正在尋找一個更短的方式來解除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] 
+0

另一種解決方案:未來(t).liftKleisli –