Как комбинировать option с Клейсли

Учитывая метод

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))

Любая идея улучшить?


person Yann Moisan    schedule 08.04.2016    source источник
comment
Это выглядит хорошо для меня. Вы также можете использовать fold непосредственно на a и поднять default в Kleisli для пустой стороны, но вряд ли это будет лучше.   -  person Travis Brown    schedule 08.04.2016


Ответы (1)


Вот реализация идеи, предложенной в комментарии @TravisBrown.

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

Читабельность, возможно, лучше.

person Yann Moisan    schedule 01.06.2016