Scala Fold 左查找倒数第二个元素

Scala Fold left finding penultimate element

  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

先看看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,并且必须return一个(A,A).

您为第二个参数传递的函数是:

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

所以我们将 r 绑定到第一个参数,因此 r 的类型为 (A,A)。我们将 c 绑定到第二个参数,它的类型为 A,然后你 return 元组 (r,c),其类型为 ((A,A),A),但是 return 这个函数的类型应该是 (A,A),而不是 ((A,A),A)