Механизм вывода типа Haskell намного сильнее, чем Scala. В Haskell мне редко приходится явно писать типы, тогда как в Scala типы могут быть выведены только в выражениях, но не в определениях методов.
Например, см. следующий фрагмент кода Haskell:
size xs = loop xs 0
where
loop [] acc = acc
loop (_ : xs) acc = loop xs (acc+1)
Он возвращает размер списка. Компилятор Haskell может распознавать, какие типы используются и что такое определение функции. Эквивалентный код Scala:
def size[A]: List[A] => Int = xs => {
def loop: (List[A], Int) => Int = {
case (Nil, acc) => acc
case (_ :: xs, acc) => loop(xs, acc+1)
}
loop(xs, 0)
}
Или с определениями методов:
def size[A](xs: List[A]) = {
def loop(xs: List[A], acc: Int): Int = xs match {
case Nil => acc
case _ :: xs => loop(xs, acc+1)
}
loop(xs, 0)
}
Мой вопрос: почему я не могу написать их следующим образом?
def size = xs => {
def loop = {
case (Nil, acc) => acc
case (_ :: xs, acc) => loop(xs, acc+1)
}
loop(xs, 0)
}
Еще раз с определениями методов:
def size(xs) = {
def loop(xs, acc) = xs match {
case Nil => acc
case _ :: xs => loop(xs, acc+1)
}
loop(xs, 0)
}
Это потому, что никто еще не реализовал его? Является ли система типов Scala не такой мощной, как необходимо для этого случая? Или есть другие причины?