Почему вывод типа Scala не такой мощнее, чем у Haskell?

Механизм вывода типов в 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 не так мощна, как требуется в этом случае? Или есть другие причины?

44
задан Clutch 29 April 2015 в 19:18
поделиться