Ich habe Schwierigkeiten, das Folgende zu verstehen, wenn ich auf die Signaturen und Funktionsaufrufe schaue.Übergeben eines Set [List [Int]] typisierten Wertes anstelle von List [Int] - warum funktioniert das?
In meinem Arbeitsblatt habe ich folgendes (aus einem Coursera Vortrag):
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"
}
Betrachtet man die Unterschriften von placeQueen
und isSafe
:
def placeQueens(k: Int) : Set[List[Int]]
def isSafe(col: Int, queens: List[Int]) : Boolean
Ich frage mich, warum es funktioniert. Wir rufen placeQueens
auf und speichern das Ergebnis in queens
(in der for
Schleife). Das Ergebnis sollte vom Typ Set[List[Int]]
sein. Dann rufen wir isSafe
mit zwei Parametern Int
und Set[List[Int]]
an - aber ich sehe nicht, warum das funktioniert, weil queens
vom Typ Set[List[Int]]
sein sollte und der Parameter für isSafe
sollte List[Int]
.