2017-01-03 4 views
4

Я делаю простое упражнение, которое просит меня реализовать автономную функцию «map» в списке с помощью foldRight. И решение, которое я придумал это:Ошибка компиляции в отношении вывода типа scala

def mapFun[T,U](xs: List[T], f: T => U): List[U] = { 
    (xs foldRight List[U]())((x, y) => f(x) :: y) 
} 

val sl = List(1,2,3) 

//now try to square every item 
mapFun(sl, x => x * x) //**missing parameter type** 
mapFun(sl, (x:Int) => x * x) //ok, gives List(1,4,9) 

Как обозначено выше явного типа «Int» должен быть указан код для компиляции. Однако мне кажется, что компилятор должен иметь возможность вывести тип «x», поскольку «sl» имеет тип «List [Int]», что означает, что T является «Int», а затем тип выражения «x * x» U также должен быть «Int».

Я предполагаю, что это может иметь что-то делать с дисперсией или противопоказаны дисперсии рода вещи или что-то, где к югу типирование смешивается с общим типизации ..

Моя версия Scala компилятор 2,11 расслоением (динамика).


Дополнение к стандартному ответу: Из Functional Programming in Scala главы 3:

Это прискорбное ограничение компилятор Scala; другие функциональные языки, как Haskell и OCaml обеспечивают полный вывод, что означает аннотации типа почти не требуется

+2

Возможный дубликат [Отсутствует тип параметра] (http://stackoverflow.com/questions/35721044/missing-parameter-type) –

ответ

7

умозаключения типа Scala, не текут внутри список параметров только между списками параметров. Это будет работать:

def mapFun[T,U](xs: List[T])(f: T => U): List[U] = { 
    (xs foldRight List[U]())((x, y) => f(x) :: y) 
} 

val sl = List(1,2,3) 
println(mapFun(sl)(x => x * x)) 
+1

Кристал ясно, спасибо. – user1206899

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