Недостатки системы типа Scala по сравнению с Haskell?

Я прочитал, что система типов Scala ослаблена совместимостью Java и поэтому не может выполнять некоторые из тех же функций, что и система типов Haskell. Это правда? Это слабость из-за стирания типа, или я ошибаюсь?во всех смыслах? Является ли эта разница той причине, что в Scala нет классов типов?

6 ответов


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

Это не управляется стиранием типа или другими требованиями JVM. Все возможные трудности здесь можно преодолеть, и были, просто рассмотрим Jaskell - http://docs.codehaus.org/display/JASKELL/Home

вывод H-M не работает в объектно-ориентированном контексте. В частности, когда используется тип-полиморфизм (в отличие от ad-hoc полиморфизма классов типов). Это имеет решающее значение для сильного взаимодействия с другими библиотеками Java и (в меньшей степени) для получения наилучшей возможной оптимизации от JVM.

на самом деле неверно утверждать, что Haskell или Scala имеют более сильную систему типов, просто это они разные. Оба языка раздвигают границы для программирования на основе типов в разных направлениях, и каждый язык имеет уникальные сильные стороны, которые трудно дублировать в другом.


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

конечно, запуск на виртуальной машине, не предназначенной в первую очередь для функционального программирования, создает некоторые проблемы совместимости с существующими языками, предназначенными для этой платформы. Поскольку большинство рассуждений о типах происходит во время компиляции, ограничения Java (как язык и как платформа) во время выполнения не о чем беспокоиться (кроме стирания типа, хотя именно эта ошибка, похоже, делает интеграцию в экосистему Java более бесшовной).

насколько я знаю, единственным "компромиссом" на уровне системы типов С Java является специальный синтаксис для обработки необработанных типов. Хотя Scala больше не разрешает необработанные типы, она принимает старые файлы классов Java с этой ошибкой. Возможно, вы видели код, как List[_] (или более длинный эквивалент List[T] forSome { type T }). Это функция совместимости с Java, но также рассматривается как экзистенциальный тип внутри и не ослабляет систему типов.

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

не обязательно связан с мощностью системы типов подход компиляторы Scala и Haskell используют для вывода типов, хотя это оказывает некоторое влияние на то, как люди пишут код. Наличие мощного алгоритма вывода типа может сделать целесообразным написать более абстрактный код (вы можете решить сами, хорошо ли это во всех случаях).

в конце концов система типов Scala и Haskell управляется желанием предоставить своим пользователям лучшие инструменты для решения их проблем, но пошли разными путями к этой цели.


еще один интересный момент для рассмотрения заключается в том, что Scala напрямую поддерживает классический OO-стиль. Это означает, что есть подтипа отношения (например, List является подклассом Seq). И это делает вывод типа более сложным. Добавьте к этому тот факт, что вы можете смешать в черты характера в Scala, которая означает, что данный тип может иметь несколько базовых типов отношений (что делает его еще более хитрое)


Scala не имеет ранг-n типа, хотя это может быть возможным, чтобы обойти это ограничение в некоторых случаях.


у меня мало опыта работы с Haskell, но самое очевидное, что я замечаю, что система типов Scala отличается от Haskell-это вывод типа.

в Scala нет глобального вывода типа, вы должны явно указать тип аргументов функции.

например, в Scala вам нужно написать следующее:

def add (x: Int, y: Int) = x + y

вместо

add x y = x + y

Это может вызвать проблему, когда вам нужна общая версия функции add, которая работает со всеми видами тип имеет метод"+". Для этого есть обходной путь, но он будет более подробным.

но в реальном использовании я обнаружил, что система типов Scala достаточно мощна для ежедневного использования, и я почти никогда не использую эти обходные пути для generic, возможно, это потому, что я пришел из мира Java.

и ограничение явного объявления типа аргументов не обязательно плохо, вам все равно нужно его документировать.


Ну, они Тьюринга сводимые?

смотрите страницу Олега Киселева http://okmij.org/ftp/ ... Можно реализовать лямбда-исчисление в системе типов Haskell. Если Scala может это сделать, то в некотором смысле система типов Haskell и система типов Scala вычисляют одни и те же типы. Вопросы таковы: насколько естественно одно над другим? Насколько элегантно одно над другим?