Scala - Вектор содержит (сравнение типов) - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь проверить Вектор "путей", которые содержат все желаемые остановки. Я уже создал функцию, которая дает все пути, которые имеют данную остановку.

    def pathIncludesPoint(pathList: PathList, stopWanted: Point): Option[Vector[Path]] = {

     if (pathList.paths.isEmpty) None

     else Some(

       for {
         path <- pathList.paths
         stop <- path.stops
         if stop.contains(stopWanted)
       } yield path)

    }

   def pathIncludesListOfPoint(pathList: PathList, stopsWanted: Vector[Point]): Option[Vector[Path]] = {

      if (pathList.paths.isEmpty) None

      else Some(

        pathList.paths.filter(path => stopsWanted.forall(stopWanted => pathIncludesPoint(pathList, stopWanted).contains(path)))

      )

   }

Я пытаюсь проверить, содержит ли Вектор требуемый путь:

pathList.paths.filter(path => stopsWanted.forall(stopWanted => pathIncludesPoint(pathList, stopWanted).contains(path)))

но последний путь возвращает ошибку, потому что я сравниваю Vector [Path] (что возвращает функцию "pathIncludePoint") и Path. Я не понимаю, используя библиотеку Scala, моя ошибка.

Спасибо!

Вот структура Path и PathList, если необходимо:

case class Path(segments: Vector[Segment]) {

  def stops: Option[Vector[Point]] = {

    if (segments.isEmpty) None

    else Some({

      for {
        segment <- segments
      } yield segment.from

     }.tail)}

}



case class PathList(paths: Vector[Path]) {

}

enter image description here

1 Ответ

0 голосов
/ 30 октября 2018

Ошибка возникает из-за того, что pathIncludesPoint(pathList, stopWanted) имеет тип Option[Vector[Path]], поэтому ваш .contains(path) фактически работает на Option, а не на Vector.

Чтобы исправить это, возможно, вы можете отказаться от использования Option и просто вернуть пустое Vector, где вы в настоящее время возвращаете None?

Или если вы хотите сохранить все варианты использования Option и просто хотите исправить строку с помощью .contains, вы можете использовать .exists следующим образом:

pathIncludesPoint(pathList, stopWanted).exists(_.contains(path))

Здесь .exists обрабатывает Option, а .contains обрабатывает Vector.

...