Я делаю простое упражнение, которое просит меня реализовать автономную функцию «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 обеспечивают полный вывод, что означает аннотации типа почти не требуется
Возможный дубликат [Отсутствует тип параметра] (http://stackoverflow.com/questions/35721044/missing-parameter-type) –