Vector[Boolean]
これは、一定時間のルックアップのためにドラッグする必要がある、純粋に機能的な DFS ルーチンです。State
モナドを使ってもっと簡潔で分かりやすくする方法はありますか? このような具体的な質問で申し訳ありません。このモナドについて、Haskell と Scala の例を含む多くの投稿を読みましたが、まだ理解できません。
object Digraph {
def apply(n: Int) = new Digraph(n, Vector.fill(n)(List.empty[Int]))
}
class Digraph private (val n: Int, val adj: Vector[List[Int]]) {
def addEdge(u: Int, v: Int) = new Digraph(n, adj.updated(u, v :: adj(u)))
def postOrder(s: Int) = {
def _postOrder(s: Int, ordered: List[Int], visited: Vector[Boolean]): (List[Int], Vector[Boolean]) = {
val newVisited = visited.updated(s, true)
val toVisit = adj(s).filter(!newVisited(_))
val init = (ordered, newVisited)
val reachable = toVisit.foldLeft(init){(acc, v) => _postOrder(v, acc._1, acc._2)}
(s::reachable._1, reachable._2)
}
_postOrder(s, List[Int](), Vector.fill(n)(false))
}
}