Scala Fold оставил нахождение предпоследнего элемента

  1. Можете ли вы объяснить мне, почему первое определение неверно по сравнению со следующим?

  2. Зачем писать ((r._2,c))._1 принесет мне предпоследний элемент?

  3. Пожалуйста, дайте мне проследить, как элементы вставляются в (r,c) или их значение.

Вот код:

scala> def penpen [A] (list:List[A]):A = {
  list.foldLeft( (list.head, list.tail.head) )((r, c) => (r,c))._1
}

8: error: type mismatch;
found   : r.type (with underlying type (A, A))
required: A
list.foldLeft( (list.head, list.tail.head) )((r, c) => (r,c))._1
                                                            ^

scala> def penpen [A] (list:List[A]):A = {
  list.foldLeft( (list.head, list.tail.head) )((r, c) =>(r._2,c))._1
}
penpen: [A](list: List[A])A

1 ответ

Решение

Давайте сначала посмотрим на подпись foldLeft:

def foldLeft[B](z: B)(f: (B, A) ⇒ B): B

Таким образом, он принимает один параметр типа: B, При указании первой группы параметров (в вашем случае (list.head, list.tail.head)Исправляешь тип этого параметра. Тип аргумента, который вы передаете: (A,A), так что теперь, в подписи, мы можем заменить (A,A) где бы то ни было BИтак, переписано, подпись foldLeft:

def foldLeft(z: (A,A))(f: (A,A),A => (A,A)): (A,A)

Таким образом, вторая группа параметров принимает функцию, которая принимает два аргумента, (A,A) и Aи должен вернуть (A,A),

Функция, которую вы передали для этого второго параметра:

(r, c) => (r,c)

Итак, мы связываем r до первого параметра, так r будет иметь тип (A,A), Мы связываем c ко второму параметру, и он имеет тип Aтогда вы вернете кортеж (r,c), который имеет тип ((A,A),A)однако тип возвращаемой функции должен был (A,A)не ((A,A),A)

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