-1
  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
4

1 回答 1

2

让我们先看一下 的签名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,并且必须返回 a (A,A)

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

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

所以我们绑定r到第一个参数,所以r会有 type (A,A)。我们绑定c到第二个参数,它有 type A,然后你返回元组(r,c),它有 type ((A,A),A),但是这个函数的返回类型应该是(A,A),而不是((A,A),A)

于 2016-01-13T04:24:59.197 回答