我试图使用flatMap和map来理解下面的代码。请解释为什么flatMap返回IndexedSeq [List [(Char,Int)]]:
使用flatMap
:
def combinations(
occurrencesV: List[(Char, Int)]): IndexedSeq[List[(Char, Int)]] = {
val ind = for {
occ <- occurrencesV
x <- (occ._2 to 1 by -1)
} yield (occ._1, x)
(1 to 2).flatMap(ind.combinations)
}
combinations(List(('a', 2), ('e', 1), ('t', 2)))
使用map
:
def comT(occurrencesV: List[(Char, Int)]): IndexedSeq[(Char, Int)] = {
val ind = for {
occ <- occurrencesV
x <- (occ._2 to 1 by -1)
} yield (occ._1, x)
(1 to 2).map(ind)
}
comT(List(('a', 2), ('e', 1), ('t', 2)))
据我所知,IndexedSeq是因为Range而是为什么List [(Char,Int)]?
答案 0 :(得分:0)
在def combinations
中,ind
是List[(Char, Int)]
。
ind.combinations
的 flatMap
会产生List[List[(Char, Int)]]
。 flatMap
打开第一个列表级别,但不打开结果中返回的第二个列表级别。
答案 1 :(得分:0)
为什么flatMap返回IndexedSeq [List [(Char,Int)]]而map给出IndexedSeq [(Char,Int)]
多数民众赞成是因为您在ind.combinations
中使用flatMap
并且仅使用ind
中的map
ind.combinations
会将<{1>}的所有组合作为ind
提供给您。
您正在将不同的函数传递给flatMap并映射。尝试传递相同的功能,您将看到List
您会看到,如果您在flatMap is used to apply flatten after a map function
函数的ind.combinations
函数中传递map
,则会返回comT
IndexedSeq[Iterator[List[(Char,Int)]]]
def comT(occurrencesV: List[(Char, Int)]): IndexedSeq[Iterator[List[(Char,Int)]]] = {
val ind = for {occ <- occurrencesV
x <- (occ._2 to 1 by -1)
} yield (occ._1,x)
(1 to 2).map(ind.combinations)
}
在您的第一个组合函数中被Iterator
我希望解释清楚易懂