2013-10-02 2 views
1

Привет всем Я довольно новичок в Scala от C#.Общее программирование в Scala

Я пытаюсь написать свою собственную версию аккумулирует (складка) Я задаюсь вопросом, почему я бегу в некоторых проблем со следующим:

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

ответ

5

Вы должны просто удалить параметр типа из loop метода. Заменить loop[T] с номером loop.

С loop[T] вы создаете новый параметр типа с именем T, так T вне loop метод и T в loop метода различные псевдонимы типа с тем же именем.

Это называется shadowing.

См эти ответы на аналогичные проблемы:

  1. Scala type parameter error, not a member of type parameter
  2. Scala, Extend object with a generic trait
  3. Generic type inference in Scala
+0

Ahh так очевидно сейчас :) Спасибо –

2

Проблема заключается в том, что с внутренней функцией loop вы определяете новый тип T, который затенение внешнего типа T.

Компилятор рассматривает их как определяющие разные типы. Если вы просто удалите параметр типа T с loop (включая рекурсивный звонок loop(list.tail, res)), вы должны найти его компилируемым просто отлично.

Смежные вопросы