2015-11-03 4 views
0

При просмотре кода для проблемы с заливом воды в классе Coursera Scala я столкнулся с двумя вариантами использования карты, где я не понимаю синтаксис.Синтаксис карты Scala

Я привык:

a.map(b => b * b) 

Но я вижу:

a map something 

Например:

next <- moves map path.extend 

это значит «для каждого следующего в движении, path.extend (следующий) "?

paths #:: from(more, explored ++ (more map (_.endstate))) 

означает ли это, что «добавить конечный пункт более изученного»?

+1

Синтаксис Scala позволяет выражать стандартный вызов метода 'obj.meth (arg)' с пробелами 'obj meth arg'. – jwvh

ответ

6

В Скале, следующие выражения эквивалентны:

moves map path.extend 
moves map(path.extend) 
moves.map(path.extend) 
moves.map(m => path.extend(m)) 

И следующие условия эквивалентны:

more map (_.endstate) 
more.map(_.endstate) 
more.map(m => m.endstate) 
+0

'move.map (path.extend)' и 'move.map (m => path.extend (m))' не являются эквивалентными: 'def a (x: Int) (y: Int) = x + y; Список (1) .map (а); Список (1) .map (x => a (x)) '(последний оператор не будет компилироваться) –

1

Чтобы ответить на первый вопрос, я думаю, вы правы насчет next <- moves map path.extend

Я предполагаю, что вы говорите о «понимании». Например,

val a = List (1, 3, 5) 

a.map(b => b * b) 
    //> res0: List[Int] = List(1, 9, 25) 

for { 
    blah <- a map (b => b * b) 
} yield blah 
    //> res1: List[Int] = List(1, 9, 25) 

Эти два результата возвращают одинаковый результат и эквивалентны в Scala.

Итак, мы говорим для каждого элемента «a» вызов функции (b => b * b).


В вашем примере это больше, как этот сценарий:

case class Song(artists:List[String], title: String) 

val songs = List(Song(List("Michael Jackson", "Janet Jackson"), "Scream"), 
          Song(List("Janet"), "Unbreakable")) 

for { 
    song <- songs 
    artist <- song.artists 
    if artist startsWith "Mic" 
} yield song.title         
    //> res0: List[String] =  List(Scream) 

songs.flatMap(
    song => song.artists.withFilter(artist => artist startsWith "Mic").map(artist => song.title) 
)             
    //> res1: List[String] = List(Scream) 

Вы можете увидеть это также эквивалентны, но «для-понимания» легче читать.

+0

Да! Я взял эту строку из этого кода: 'def from (paths: Set [Path], explored: Set [State]): Stream [Set [Path]] = if (paths.isEmpty) Stream.empty else { val more = for { path <- paths next <- перемещает карту path.extend if! (explored contains next.endState) } yield next paths # :: from (больше, explored ++ (больше карты (_ .endState))) } ' –

+1

В этом случае я думаю, что это скорее комбинация flatMap и withFilter. Я добавляю новую информацию в ответ выше. Надеюсь, поможет. –

Смежные вопросы