传递Set [List [Int]]类型的值而不是List [Int] - 为什么这样做?

时间:2016-07-24 06:33:19

标签: scala types signature

当我查看签名和函数调用时,我很难理解以下内容。

在我的工作表中,我有以下内容(摘自Coursera讲座):

 object nqueens {

  def queens(n: Int) : Set[List[Int]] = {
    def placeQueens(k: Int) : Set[List[Int]] =
      if (k == 0) Set(List())
      else
      for  {
        queens <- placeQueens(k - 1)
        col <- 0 until n
        if isSafe(col, queens)
      } yield col :: queens
    placeQueens(n)
  }

  def isSafe(col: Int, queens: List[Int]) : Boolean = {
    val row = queens.length
    val queensWithRow = (row - 1 to 0 by -1) zip queens
    queensWithRow forall {
      case (r, c) => col != c && math.abs(col - c) != row -r
    }
  }

  def show(queens: List[Int]) = {
    val lines =
      for (col <- queens.reverse)
        yield Vector.fill(queens.length)("* ").updated(col, "X ").mkString
    "\n" + (lines mkString "\n")
  }

  (queens(4) map show) mkString "\n"

}

考虑placeQueenisSafe的签名:

def placeQueens(k: Int) : Set[List[Int]]

def isSafe(col: Int, queens: List[Int]) : Boolean

我想知道为什么会这样。我们调用placeQueens并将结果保存在queensfor循环中)。

结果应为Set[List[Int]]类型。然后我们使用isSafeInt这两个参数调用Set[List[Int]] - 但我不明白为什么会有效,因为queens应该是Set[List[Int]]类型的isSafe的参数应为List[Int]

2 个答案:

答案 0 :(得分:3)

  

我们调用placeQueens并将结果保存在女王

您的代码未将placeQueens的结果保存到queens

for  {
    queens <- placeQueens(k - 1)
    col <- 0 until n
    if isSafe(col, queens)
  } yield col :: queens

此代码实际上用于理解。有问题的特定行:

queens <- placeQueens(k-1) 

正在将List[Int]存储到皇后,因为它正在迭代从Set[List[Int]]返回的placeQueens。为了给出一个更简单的例子,可以帮助说明发生了什么,请考虑:

val a = Set(1,2,3)
val b = for (x <- a) yield x + 2

执行此代码后,b将为Set(3,4,5)。这是因为在for循环的每次迭代中,x先是1,然后是2,然后是3。

答案 1 :(得分:2)

  

我们调用placeQueens并将结果保存在queens中(在for循环中)。

不,您正在调用placeQueens并迭代结果。在每次迭代时,queens指的是当前元素。