scala:如果flatMap用于在map函数后应用flatten,为什么flatMap返回IndexedSeq [List [(Char,Int)]]而map给出IndexedSeq [(Char,Int)]

时间:2018-03-25 08:01:13

标签: scala

我试图使用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)]?

2 个答案:

答案 0 :(得分:0)

def combinations中,indList[(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

展开

我希望解释清楚易懂