如何将期权与 Kleisli 组合
How to combine option with 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) }
}
但在阅读 之后,我想出了一个更好的版本:
def g[A, B, C](a: Option[A], default: => C) : Kleisli[Future, B, C] =
a.traverseU(f[A, B, C]).map(_.getOrElse(default))
有什么改进的想法吗?
这是@TravisBrown 在评论中建议的想法的实现。
def g[A, B, C](a: Option[A], default: => C) : Kleisli[Future, B, C] =
a.fold(Future(default).liftKleisli[B])(f)
可读性可能更好。
给定一个方法
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) }
}
但在阅读
def g[A, B, C](a: Option[A], default: => C) : Kleisli[Future, B, C] =
a.traverseU(f[A, B, C]).map(_.getOrElse(default))
有什么改进的想法吗?
这是@TravisBrown 在评论中建议的想法的实现。
def g[A, B, C](a: Option[A], default: => C) : Kleisli[Future, B, C] =
a.fold(Future(default).liftKleisli[B])(f)
可读性可能更好。