значение знака подчеркивания в строках списка - PullRequest
0 голосов
/ 15 сентября 2018

В следующем коде из "функционального программирования в скале", что означает _ здесь? Я думаю, что он представляет результат последовательности (t), но когда я заменил его на последовательность (t), он даетмне ошибка компиляции. Почему это? Что я могу сделать, чтобы сделать это _ явным?

Редактировать: Я запутался, что если это _ следует расширить в результат последовательности (t), перечислите всерегистр подчеркивания здесь здесь не помогает, я уже рассмотрел его.

@ def sequence[A](a: List[Option[A]]): Option[List[A]] =
  a match {
      case Nil => Some(Nil)
      case h :: t => h flatMap (hh => sequence(t) map (hh :: _))
  }

defined function sequence

@

@ sequence(List(Some(1), Some(2))
  )
res1: Option[List[Int]] = Some(List(1, 2))

Замените _ на последовательность (t)

def sequence[A](a: List[Option[A]]): Option[List[A]] =
a match {
    case Nil => Some(Nil)
    case h :: t => h flatMap (hh => sequence(t) map (hh :: sequence(t)))
}
cmd4.sc:4: value :: is not a member of Option[List[A]]
case h :: t => h flatMap (hh => sequence(t) map (hh :: sequence(t)))
                                                    ^
Compilation Failed

1 Ответ

0 голосов
/ 15 сентября 2018

В любом контексте hh :: _ - это просто ярлык для _.::(hh), который, в свою очередь, является ярлыком для x => x.::(h) или x => hh :: x.Тип аргумента в этом случае List[A] (потому что это список A внутри Option).Следовательно, ваш код выполняет те же действия, что и следующий код:

def sequence[A](a: List[Option[A]]): Option[List[A]] = 
  a match {
    case Nil => Some(Nil)
    case h :: t => h flatMap (hh => sequence(t) map ((xs: List[A]) => hh :: xs))
  }

Независимо от того, используется ли он внутри flatMap или где-то еще, он совершенно не имеет значения.

...