2012-01-11 22 views
6

我遇到好幾個地方,我必須是否有更習慣於從選項[IO [選項[A]]獲取IO [選項[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) 

眼看.sequence.map(_.join)一遍又一遍地重複一個類似於開始煩我。有沒有更成功的方式來完成同樣的事情?

+1

你確定這個例子中的類型嗎? g的類型在我看來與flatMap不兼容。 – 2012-01-12 06:05:57

+0

如果我的理解正確,你想要做到這一點: http://stackoverflow.com/questions/5968345/un-optioning-an-optioned-option – 2012-01-12 09:29:36

回答

1

這聽起來像使用案例單子變壓器,看到here在Haskell和here在斯卡拉一個討個說法。

1

處理Option鏈的習慣方法是使用for-comprehensions和getOrElse調用。

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

有沒有得到周圍有任何默認或拋出一個異常,如果你要斷然解壓Option因爲f可以返回Noneg不能接受。

相關問題