如何将选项与Kleisli结合起来

时间:2016-04-08 12:36:54

标签: scala scalaz kleisli

给出方法

def f[A, B, C](a: A) : Kleisli[Future, B, C] = ???

我需要一个使用Option[A]

的组合器

我的第一次尝试是:

def g[A, B, C](a: Option[A], default: => C) = a match {
  case Some(a) => save(a)
  case None => Kleisli[Future, B, C] { _ => Future.successful(default) }
}

但在阅读How to combine sequence of Kleisli之后,我想出了一个更好的版本:

def g[A, B, C](a: Option[A], default: => C) : Kleisli[Future, B, C] = 
  a.traverseU(f[A, B, C]).map(_.getOrElse(default))

有什么改进的想法吗?

1 个答案:

答案 0 :(得分:0)

以下是@TravisBrown评论中提出的想法的实现。

def g[A, B, C](a: Option[A], default: => C) : Kleisli[Future, B, C] =
  a.fold(Future(default).liftKleisli[B])(f)

可读性可能更好。