2012-01-11 1 views
6

私は.sequence.map(_.join)は何度も繰り返し見て IO [Option [A]]をOption [IO [Option [A]]から取得し、シーケンスとマッピングを使用してより慣用的な方法がありますか?

def f(s: String): Option[Long] = ... 
def g(l: Long): IO[Option[Wibble]] = ... 

val a: IO[Option[Wibble]] = f(param).flatMap(g).sequence.map(_.join) 

に似何かを持っているかなりの数の場所に実行しているが私を気にし始めています。同じことを達成するためにもっと慣れ親しんだ方法がありますか?

+1

例のタイプについては確かですか? gの型はflatMapと互換性がないように見えます。 –

+0

私はあなたを正しく理解していれば、正確にそれをしたいと思う: http://stackoverflow.com/questions/5968345/un-optioning-an-オプション - オプション –

答えて

1

モナド変圧器のユースケースのように聞こえます。詳しくはHaskellでhere、スカラではhereを参照してください。

1

Optionチェーンを扱う慣用方法は、for-comprehensionsとgetOrElseコールを使用することです。

val a = for { 
    val temp <- f(param) 
    val result <- Some(g(temp)) 
} yield result getOrElse <Default Here> 

あなたはfNoneを返すことができますし、gがそれを受け入れることができないので、一概にOptionを展開しようとしている場合、デフォルトを持つか、例外を発生させるのいずれかを歩き回るはありません。

関連する問題