你能解释一下为什么第一个定义与下一个定义相比是错误的吗?
为什么写((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
答案 0 :(得分:2)
让我们先看一下def foldLeft[B](z: B)(f: (B, A) ⇒ B): B
的签名:
B
因此需要一个类型参数:(list.head, list.tail.head)
。当您指定第一个参数组时(在您的情况下为(A,A)
),您正在修复此参数的事物类型。您传递的参数类型为(A,A)
,所以现在,在签名中,我们可以替换B
之前曾说def foldLeft(z: (A,A))(f: (A,A),A => (A,A)): (A,A)
的任何地方,所以改写后,foldLeft的签名是:
(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)
,而不是{{1}}