在查看Coursera Scala课程中的浇水问题代码时,我遇到了两种地图用法,我不懂语法。
我曾经:
a.map(b => b * b)
但我看到了:
a map something
例如:
next <- moves map path.extend
这意味着&#34;对于每个下一个移动,路径扩展(下一个)&#34;?
paths #:: from(more, explored ++ (more map (_.endstate)))
这是否意味着&#34;添加更多的国家/地区以进行探索&#34;?
答案 0 :(得分:6)
在scala中,以下表达式是等效的:
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)
答案 1 :(得分:1)
要回答您的第一个问题,我认为您对next <- moves map path.extend
我假设你正在谈论一个&#34;理解&#34;。例如,
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中是等效的。
所以我们要对&#34; a&#34;中的每个元素说。调用函数(b =&gt; 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)
你可以看到这些也是等价的但是对于理解而言#34;更容易阅读。