Scala - Вложенные циклы, для понимания и тип конечной итерации - PullRequest
2 голосов
/ 06 февраля 2012

Я относительно новичок в scala и успешно создал несколько действительно простых программ.Однако теперь, когда я пытаюсь решить некоторые проблемы в реальном мире, все становится немного сложнее ...

Я хочу прочитать некоторые файлы в объектах «Конфигурация», используя различные подтипы «FileTypeReader», которые могут'принять' определенные файлы (по одному для каждого подтипа FileTypeReader) и вернуть Option [Configuration], если он может извлечь из него конфигурацию.

Я пытаюсь избежать императивного стиля и написал, например, что-товот так (используя scala-io, scaladoc для Path здесь http://jesseeichar.github.com/scala-io-doc/0.3.0/api/index.html#scalax.file.Path):

(...)
trait FileTypeReader {
   import scalax.file.Path
   def accept(aPath : Path) : Option[Configuration]
}
var readers : List[FileTypeReader] = ...// list of concrete readers
var configurations = for (
          nextPath <- Path(someFolder).children();
          reader <- readers
      ) yield reader.accept(nextPath);
(...)

Конечно, это не сработает, for-compitionsings возвращает коллекцию первого типа генератора (здесь, некоторый IterablePathSet).

Поскольку я пробовал много вариантов и чувствую, что бегаю по кругу, прошу у вас советов по этому вопросу, чтобы решить мою - тривиальную?- проблема с элегантностью!:)

Большое спасибо заранее,

sni.

Ответы [ 2 ]

4 голосов
/ 06 февраля 2012

Если я правильно понимаю, ваша проблема в том, что у вас есть Set[Path] и вы хотите получить List[Option[Configuration]].Как написано, configurations будет Set[Option[Configuration]].Чтобы изменить это значение на List, используйте метод toList, т. Е.

val configurations = (for {
    nextPath <- Path(someFolder).children
    reader   <- readers
  } yield reader.accept(nextPath) ).toList

, или измените тип самого генератора:

val configurations = for {
    nextPath <- Path(someFolder).children.toList
    reader   <- readers
  } yield reader.accept(nextPath)

Вы, вероятно, действительно хотите получитьList[Configuration], что вы можете сделать элегантно, поскольку Option является монадой:

val configurations = for {
    nextPath <- Path(someFolder).children.toList
    reader   <- readers
    conf     <- reader.accept(nextPath)
  } yield conf
0 голосов
/ 06 февраля 2012

Вы пытаетесь найти первую конфигурацию, которую он может извлечь?Если нет, что произойдет, если будет возвращено несколько конфигураций?

В первом случае я просто получу результат для понимания и вызову find для него, который вернет Option.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...