Scala中的泛型编程
大家好,我是来自C#的Scala新手 我正在尝试编写自己版本的accumulate(fold),我想知道为什么我会遇到以下问题: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{
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现在很明显:)谢谢