Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala中的泛型编程_Scala_Generics_Generic Programming - Fatal编程技术网

Scala中的泛型编程

Scala中的泛型编程,scala,generics,generic-programming,Scala,Generics,Generic Programming,大家好,我是来自C#的Scala新手 我正在尝试编写自己版本的accumulate(fold),我想知道为什么我会遇到以下问题: def accumulate[T](list : List[T], initial: T, f: (T, T) => T) : T = { @tailrec def loop[T](list: List[T], accum: T) : T = if(list.length == 0) accum else{

大家好,我是来自C#的Scala新手

我正在尝试编写自己版本的accumulate(fold),我想知道为什么我会遇到以下问题:

def accumulate[T](list : List[T], initial: T, f: (T, T) => T) : T = {
    @tailrec def loop[T](list: List[T], accum: T) : T =
      if(list.length == 0)
        accum
      else{
        val head : T = list.head
        val res : T = f(accum,head)
        loop[T](list.tail, res)
      }
    loop(list,initial)
  }
我得到以下错误:

type mismatch;
 found   : accum.type (with underlying type T)
 required: T
        val res : T = f(accum,head)
                        ^
考虑到一切都是T型,我看不出我怎么会有类型不匹配

如有任何想法/帮助,将不胜感激


Blair

您应该从
循环
方法中删除类型参数。将
loop[T]
替换为
loop

使用
loop[T]
可以创建名为
T
的新类型参数,因此
T
外部
loop
方法和
loop
方法中的
T
是同名的不同类型别名

它被称为阴影

有关类似问题,请参见以下答案:


  • 您应该只从
    循环
    方法中删除类型参数。将
    loop[T]
    替换为
    loop

    使用
    loop[T]
    可以创建名为
    T
    的新类型参数,因此
    T
    外部
    loop
    方法和
    loop
    方法中的
    T
    是同名的不同类型别名

    它被称为阴影

    有关类似问题,请参见以下答案:


  • 问题在于,使用内部函数
    loop
    定义了一个新类型
    T
    ,该类型覆盖了外部类型
    T


    编译器将它们视为定义不同的类型。如果只从
    loop
    (包括递归调用
    loop(list.tail,res)
    )中删除
    T
    类型参数,您应该会发现它编译得很好。

    问题在于,对于内部函数
    loop
    ,您正在定义一个新的类型
    T
    ,该类型隐藏了外部类型
    T

    编译器将它们视为定义不同的类型。如果您只是从
    loop
    (包括递归调用
    loop(list.tail,res)
    )中删除
    T
    类型参数,您会发现它编译得很好。

    Ahh现在很明显:)Thanksah现在很明显:)谢谢