Как карта работает на Опции в Scala?

У меня есть эти две функции

  def pattern(s: String): Option[Pattern] =
try {
  Some(Pattern.compile(s))
} catch {
  case e: PatternSyntaxException => None
}

а также

  def mkMatcher(pat: String): Option[String => Boolean] =
     pattern(pat) map (p => (s: String) => p.matcher(s).matches)

Карта - это функция высшего порядка, которая применяет данную функцию к каждому элементу списка.

Теперь я не понимаю, как работает карта, как указано выше.

2 ответа

Решение

Карта - это функция высшего порядка, которая применяет данную функцию к каждому элементу списка.

Это необычно ограничительное определение карты.

Во всяком случае, это работает, потому что это было определено кем-то, кто не придерживался этого.

Например, что кто-то написал что-то похожее на

sealed trait Option[+A] {
  def map[B](f: A => B): Option[B] = this match {
    case Some(value) => Some(f(value))
    case None => None
  }
}

как часть стандартной библиотеки. Это делает карту применимой к Option[A]

Он был определен потому, что имеет смысл отображать многие виды структур данных, а не только списки. Отображение - это преобразование, применяемое к элементам, содержащимся в структуре данных.

Он применяет функцию к каждому элементу.

Option[A] можно рассматривать как тривиальную последовательность. У него либо ноль, либо один элемент. Чтобы отобразить это означает применить функцию к ее элементу, если он есть.

Теперь, возможно, не имеет смысла использовать это средство постоянно, но есть случаи, когда оно полезно.

Например, это один из немногих отдельных методов, которые, если они присутствуют, включают возможность для выражений работать с типом. Option[A] может быть использован для выражений, которые могут быть удобными.

Например

val option: Option[Int] = Some(2)

val squared: Option[Int] = for {
  n <- option
  if n % 2 == 0
} yield n * n

Интересно, что это означает, что фильтр также определен на Option[A],

Если у вас просто простое значение, может быть понятнее использовать менее общую конструкцию.

Карта работает так же, как и с другими типами коллекций, такими как List и Vector. Он применяет вашу функцию к содержимому коллекции, потенциально изменяя тип, но сохраняя тип коллекции тем же.

Во многих случаях вы можете рассматривать Option как коллекцию с 0 или 1 элементом. В Option вы можете выполнять те же операции, что и в других коллекциях.

Вы можете изменить значение

var opt = Option(1)

opt.map(_ + 3)
opt.map(_ * math.Pi)
opt.filter(_ == 1)
opt.collect({case i if i > 0 => i.toString })

opt.foreach(println)

и вы можете проверить значение

opt.contains(3)
opt.forall(_ > 0)
opt.exists(_ > 0)
opt.isEmpty

Используя эти методы, вам редко нужно использовать оператор соответствия, чтобы снять флажок с параметра.

Другие вопросы по тегам