Scala:将表达式转换为更高阶函数

时间:2018-04-05 10:08:49

标签: scala

我正在尝试Scala练习,其中表达式转换为更高阶函数 - flatMap,filter和map。 我不明白地图输入(List(author1,author2))是如何转换为book.title的。

输入:

val books:List[Book] = List(
    Book(title = "kids watching", authors = List("Aavik","Arjun"))
  )

表达方式:

for{
    book <- books
    name <- book.authors
    if name.startsWith("Aavik")
  } yield book.title

高阶函数:

books flatMap(book =>
    book.authors filter(name => name startsWith("Aavik")) map(_ => book.title))

地图输入是List(“Aavik”),地图与book.title有什么关系?

2 个答案:

答案 0 :(得分:1)

@Aavik请阅读How does yield work?文章。

您的示例的Desugared版本将如下所示:

case class Book(title: String, authors: List[String])

val books: List[Book] = List(
    Book(title = "kids watching", authors = List("Aavik","Arjun"))
  )

books.flatMap { (book: Book) => 
  book.authors.withFilter { (name: String) =>
    name.startsWith("Aavik")
  }.map { _ =>
    book.title
  }
}

如您所见map { _ => book.title }book变量的范围相同。您可以在Scastie中运行此示例。

Ammonite REPL desugar可以帮助调查Scala如何翻译for-comprehensions。

答案 1 :(得分:0)

如果我的问题是正确的,在上面的例子中,即

.color-red { color: red;}
.color-blue { color : blue; }
.color-green { color : green; }

这实际上会转换为:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="color-red test">
  <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
</div>
<div class="color-blue test2">
  <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
</div>
<div class="color-green test3 test4">
  <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
</div>

<button type="button" id="remove">Remove color</button>

所以,正如你所看到的那样,我们有一本书是flatMap的输入,它可以在里面的任何地方访问。因此,在map中访问book.title没有问题,因为map包含在flatMap中。

如果您想要更清晰,请告诉我。

相关问题