Scala Fold离开了倒数第二个元素

时间:2016-01-13 02:39:57

标签: scala foldleft

  1. 你能解释一下为什么第一个定义与下一个定义相比是错误的吗?

  2. 为什么写((r._2,c))._1会获取倒数第二个元素?

  3. 请告诉我如何在(r,c)中插入元素或其重要性。

  4. 以下是代码:

    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 个答案:

答案 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}}