1

検討:

def xs(c: String): Option[List[Long]] = ...

val ys: Stream[Long] = ...

今、私は次のようなメソッドを書きます:

def method(oc: Option[String]): Option[Long] = for { 
    c <- oc
    list <- xs(c)
} yield{        
    for {
        first <- ys.find(list contains _)
    } yield first
}

ただし、推測される型はOption [Option [Long]]であるため、もちろんこれはコンパイルされません。

Scala構文と標準ライブラリに関してOption[Long]を取得する方法はありますか?パターンマッチングができることは知っていますが、理解のためにそれを使用して実行できるかどうかという疑問が生じただけです。


答えてくれたtenshiに感謝します、それは仕事をします、しかし私はちょうど私の問題の別の例に遭遇しました:

class T
class U
class A(t: String)(implicit x: T)
def getU(a: A): Option[U] = ...

def getU_2(oc: Option[String]): Option[U] = for{
   c <- oc
} yield{
   implicit val someImplicit: T = new T
   val a = A(c)

   getU(a)
}

afor asとして追加できます:a <- Some(A(c))しかし、暗黙的にはどうですか?それは私のコードの設計変更を意味する必要がありますか?

4

1 に答える 1

7

なぜ2つのネストされたfor内包表記を使用しているのですか?仕事をするべきではありませんか?

def method(oc: Option[String]): Option[Long] = 
    for { 
        c <- oc
        list <- xs(c)
        first <- ys.find(list contains _)
    } yield first 

アップデート

2番目の例について。他の場所で暗黙的に定義してインポートするか、メソッドの最初で定義することができますが、スコープをできるだけ狭くしたいと思います。この場合、for理解の中でブロックを直接使用できます。

def getU_2(oc: Option[String]): Option[U] = for {
   c <- oc
   a <- {
       implicit val someImplicit: T = new T
       getU(new A(c))
   }
} yield a

または(おそらく最も単純な)暗黙のパラメーターを明示的に提供します。

def getU_2(oc: Option[String]): Option[U] = for {
   c <- oc
   a <- getU(new A(c)(new T))
} yield a 
于 2011-10-30T08:53:24.153 に答える