15

ほとんどのSQL実装(この質問はSQLとは関係ありません。これは単なる例です)は、そうでない場合にCOALESCE(x1,x2,...,xn)返す関数を提供し、そうでない場合はどちらでもない場合にのみ返すなどです。すべての値が である場合、結果はです。x1NULLx2x2NULLxiNULLNULL

値が に置き換えられるCOALESCEため、Scala でSQL のようなものを取得したかったのです。いくつかの例を挙げます:OptionNULLNone

> coalesce(None,Some(3),Some(4))
res0: Some(3)

> coalesce(Some(1),None,Some(3),Some(4))
res1: Some(1)

> coalesce(None,None)
res2: None

だから私はそれを次のように実装しました:

def coalesce[T](values: Option[T]*): Option[T] = 
    (List[T]() /: values)((prev: List[T], cur: Option[T]) =>
                          prev:::cur.toList).headOption

それは正常に動作しますが、Scala の一部として実装されたこの関数のようなものが既に存在するのだろうかと思います。

4

4 に答える 4

10

自動応答:

ネイティブ メカニズム (関数を実装しない) は、メソッドcoalesceへの呼び出しの連鎖です。orElse

> None.orElse(Some(3)).orElse(Some(4))
res0: Option[Int] = Some(3)

> Some(1).orElse(None).orElse(Some(3)).orElse(Some(4))
res1: Option[Int] = Some(1)

> None.orElse(None)
res2: Option[Nothing] = None
于 2015-03-24T17:41:11.017 に答える
7

どうですか:

values.flatten.headOption

これOptionは に暗黙的に変換できるIterableためflatten機能するため、リストのリストとほとんど同じように機能します。

于 2015-03-24T13:58:30.963 に答える