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



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

711   6  

6 ответов:

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

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

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

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

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

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

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

система типов Scala поддерживает type classes, хотя и более подробно, чем Хаскелл. Я предлагаю прочитать эту статью, которая может создать другое впечатление об относительной силе системы типов 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/ ... Можно реализовать лямбда-исчисление в системе типов Хаскелла. Если Scala может это сделать, то в некотором смысле система типов Haskell и система типов Scala вычисляют одни и те же типы. Возникает вопрос: насколько естественно одно над другим? Насколько элегантно одно над другим?

Comments

    Ничего не найдено.