Рассмотреть возможность:
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)
}
Я могу добавить a
в for as: a <- Some(A(c))
но как насчет неявного? Должно ли это означать изменение дизайна моего кода?
for
в начале тела метода и должны использовать<-
вfirst = ys.find(list contains _)
. - person tenshi   schedule 30.10.2011def getU_2(oc: Option[String]): Option[U] = { implicit .. for { c <- oc a <- Some(A(c)) u <- getU(a) } yield u }
- person Carlos López-Camey   schedule 30.10.2011