2016-04-08 12 views
3

ile seçeneği birleştirmek nasıl bir Option[A]Kleisli

Benim ilk denemede ile çalışan bir bağdaştırıcının gereken bir yöntem

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

Verilen oldu:

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

Ama How to combine sequence of Kleisli okuduktan sonra, geldim Daha iyi bir sürümle birlikte:

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

Gelişmek için bir fikrin var mı?

+0

Bana iyi görünüyor. Ayrıca 'a' üzerinde '' '' '' yı '' kullanabilirsiniz ve boş '' için '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'ı boş bir tarafa bir' Kleisli' içine kaldırabilirsiniz, ancak bu herhangi bir hoş bitmek olası değildir –

cevap

0

@TravisBrown tarafından yorumda önerilen fikrin uygulanması.

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

Okunabilirlik belki daha iyidir.