Подтвердить что ты не робот

Есть ли способ объявить неявный val внутри a для понимания?

У меня есть код с вложенными вызовами flatMap:

foo.flatMap(implicit f => bar(123).flatMap(b =>
  /* and so on... implicit f is still in scope here.*/
))

Обычно можно написать это как для понимания, что делает код более читаемым:

for {
  f <- foo
  b <- bar(123)
  /* yet more method calls that need f as an implicit parameter*/
}

Но мне нужно f быть неявным, и я не вижу способа сделать это для понимания. Здесь? Конечно, я мог бы передать f явно, но это означало бы до свидания довольно DSL. Меня бы интересовали ответы как для Scala 2.9, так и для 2.10.

Чтобы быть ясным, я хотел бы сделать что-то подобное, но он не будет компилироваться:

for {
  implicit f <- foo
  b <- bar(123) //bar takes implicit argument
  /* yet more method calls that need f as an implicit parameter*/
}

РЕДАКТИРОВАТЬ: Может быть, запрос функции будет хорошей идеей?

EDIT2:. Это должно работать со всеми типами, которые могут использоваться для понимания, поэтому не только с обычными типами коллекций, такими как List или Seq, но также с Future.

4b9b3361

Ответ 2

Начиная с версии 0.3.0-M1, плагин лучше-monadic-for обеспечивает такую функциональность.

Ответ 3

Как насчет этого кода?

// prerequisites
val (a,b) = (List(1,2,3), List(3,4,5,7,9))
def tree(n: Int)(implicit s: Int) = " "*s + "0"*n + (if (s+3 < n) "*" else "")

// actual for
@volatile implicit var s = 0
for (i <- a if ({s = i; true}); j <- b) 
  println(tree(j))

// 000
// 0000
// 00000*
// 0000000*
// 000000000*
//  000
//  0000
//  00000
//  0000000*
//  000000000*
//   000
//   0000
//   00000
//   0000000*
//   000000000*