输入不匹配以进行理解:获取“具有可序列化的产品”

Ale*_* V. 5 types scala yield for-comprehension

我正在编写一个函数,该函数将List[(Char, Int)]在字符串中获取一个字符出现列表 ( ),并生成该出现列表的所有子集。

所以,给定

List(('a', 2), ('b', 2))
Run Code Online (Sandbox Code Playgroud)

它会产生

List(
  List(),
  List(('a', 1)),
  List(('a', 2)),
  List(('b', 1)),
  List(('a', 1), ('b', 1)),
  List(('a', 2), ('b', 1)),
  List(('b', 2)),
  List(('a', 1), ('b', 2)),
  List(('a', 2), ('b', 2))
)
Run Code Online (Sandbox Code Playgroud)

我是这样实现的:

type Occurrences = List[(Char, Int)]

def combinations(occurrences: Occurrences): List[Occurrences] =
  if (occurrences.isEmpty) List(List())
  else for {
    (c, n) <- occurrences
    i <- n to 1 by -1
  } yield (c, i) :: combinations(occurrences.tail)
Run Code Online (Sandbox Code Playgroud)

我得到这个错误:

type mismatch;
 found   : List[List[Product with Serializable]]
 required: List[Occurrences]
    (which expands to)  List[List[(Char, Int)]]
Run Code Online (Sandbox Code Playgroud)

请帮助我理解,为什么会发生这种情况,我该如何解决?

我尝试将其重写为 flatMap ......,使用 Intellij 的“解释 Scala 代码”等。

tka*_*uko 4

实际上缺少括号:

type Occurrences = List[(Char, Int)]

  def combinations(occurrences: Occurrences): List[Occurrences] =
    if (occurrences.isEmpty) List(List())
    else (for {
      (c, n) <- occurrences
      i <- n to 1 by -1
    } yield (c, i)) :: combinations(occurrences.tail)
Run Code Online (Sandbox Code Playgroud)

在您的原始理解代码中,尝试生成其中包含元素(/another )(c, i) :: combinations(occurrences.tail)的内容。ListAnyTupleList

更新:

需要魔法的正确方法:

type Occurrences = List[(Char, Int)]


  /**
    * Returns the list of all subsets of the occurrence list.
    *  This includes the occurrence itself, i.e. `List(('k', 1), ('o', 1))`
    *  is a subset of `List(('k', 1), ('o', 1))`.
    *  It also include the empty subset `List()`.
    *
    *  Example: the subsets of the occurrence list `List(('a', 2), ('b', 2))` are:
    *
    *    List(
    *      List(),
    *      List(('a', 1)),
    *      List(('a', 2)),
    *      List(('b', 1)),
    *      List(('a', 1), ('b', 1)),
    *      List(('a', 2), ('b', 1)),
    *      List(('b', 2)),
    *      List(('a', 1), ('b', 2)),
    *      List(('a', 2), ('b', 2))
    *    )
    *
    *  Note that the order of the occurrence list subsets does not matter -- the subsets
    *  in the example above could have been displayed in some other order.
    */
  def combinations(occurrences: Occurrences): List[Occurrences] =
    occurrences.foldRight(List[Occurrences](Nil)) {
      case ((ltr, cnt), acc) =>
        acc ::: (for {
          comb <- acc
          ltrNum <- 1 to cnt
        } yield (ltr, ltrNum) :: comb)
    }
Run Code Online (Sandbox Code Playgroud)

向这段代码的作者致敬。