Scala Fold 左查找倒数第二个元素
Scala Fold left finding penultimate element
你能解释一下为什么第一个定义与下一个相比是错误的吗?
为什么写 ((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
先看看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)
你能解释一下为什么第一个定义与下一个相比是错误的吗?
为什么写
((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
先看看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)