Scala Fold оставил нахождение предпоследнего элемента
Можете ли вы объяснить мне, почему первое определение неверно по сравнению со следующим?
Зачем писать
((r._2,c))._1
принесет мне предпоследний элемент?Пожалуйста, дайте мне проследить, как элементы вставляются в
(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)