scala: добавить список с помощью foldRight - PullRequest
0 голосов
/ 04 октября 2018

Я изучаю красную книгу scala, опубликованную Мэннингом

Реализация List - это класс case:

case class Cons[+A](head: A, tail: List[A]) extends List[A]

foldRight определяется как:

def foldRight[A, B](as: List[A], z: B)(f: (A, B) => B): B 

и реализовано как

  def foldRight[A, B](as: List[A], z: B)(f: (A, B) => B): B = { // Utility functions
    as match {
      case Nil => z
      case Cons(h, t) => f(h, foldRight(t, z)(f))
    }
  }

Чтобы добавить один список в другой, мое решение было следующим:

  def append[A](l1: List[A], l2: List[A]): List[A] 
      = foldRight(l1, l2)((l1head,l2)=>Cons(l1head, l2))

ключ ответа, однако, показывает следующий код:

  def append[A](l1: List[A], l2: List[A]): List[A] = foldRight(l1, l2)(Cons(_, _))

Вопрос: Как (Cons(_, _)) соответствует сигнатуре метода f: (A, B) => B

1 Ответ

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

Оба append() примера абсолютно одинаковы.1-е подчеркивание является сокращением для «1-го переданного параметра», а 2-е подчеркивание является сокращением для «2-го переданного параметра».Это просто удобный способ ссылки на них и передачи их конструктору Cons, не удосуживаясь дать каждому имя.

См. Также различные ответы на этот вопрос .

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