0

このコードでは:

import java.io.File
def recursiveListFiles(f: File): Array[File] = {
  val these = f.listFiles
  these ++ these.filter(_.isDirectory).flatMap(recursiveListFiles)
}

から取得: scala のサブディレクトリ内のすべてのファイルを一覧表示するにはどうすればよいですか?

なぜflatMap(recursiveListFiles)コンパイルするのですか?パラメータをrecursiveListFiles受け入れるように?Fileファイル パラメータは暗黙的に に渡されrecursiveListFilesますか?

4

3 に答える 3

1

いいえ、展開されたflatMapものは次のように見えるためです。

flatMap(file => recursiveListFiles(file))

したがって、各filetheseにマップされ、Array[File]で平坦化されflatMapます。ここには暗黙の魔法はありません(あなたが求めている方法で)。

于 2015-02-06T22:54:24.103 に答える
0

並べ替え。flatMap引数をそれ自体の引数に明示的に渡します。これが高階関数の性質です。基本的には、コールバックを与え、コールバックを呼び出し、結果に対して何かを行います。唯一暗黙的に行われるのは、メソッドから関数型への変換です。

どのメソッドも同等の関数型に変換できます。これdef recursiveListFiles(f: File): Array[File]File => Array[File]素晴らしいことです。これは、Array[File]flatMap[B](f: File => Array[B]): Array[B]あり、メソッドの関数型が完全に適合するためです。型パラメーターBは に選択されますFile

別の回答で述べたように、次のようにしてその関数を明示的に作成できます。

these.filter(_.isDirectory).flatMap(file => recursiveListFiles(file))または these.filter(_.isDirectory).flatMap(recursiveListFiles(_))または these.filter(_.isDirectory).flatMap(recursiveListFiles _)

より複雑な状況では、これらのより詳細なオプションのいずれかを使用する必要がある場合がありますが、あなたの場合は気にする必要はありません。

于 2015-02-07T15:04:50.007 に答える
0

flatMapf: (A) ⇒ GenTraversableOnce[B]を返す関数を取りますList[B]

あなたの場合、recursiveListFilesどちらが aFile ⇒ Array[File]であるため、 a を返しますList[File]。この結果List[File]は に連結されtheseます。

于 2015-02-06T22:55:33.880 に答える