Недостатки системы типов Scala по сравнению с Haskell? - PullRequest
53 голосов
/ 11 сентября 2010

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

Ответы [ 6 ]

53 голосов
/ 11 сентября 2010

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

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

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

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

23 голосов
/ 11 сентября 2010

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

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

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

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

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

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

13 голосов
/ 11 сентября 2010

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

10 голосов
/ 11 сентября 2010

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

8 голосов
/ 11 сентября 2010

У меня только небольшой опыт работы с Haskell, но самое очевидное, что я отмечаю, что система типов Scala, отличающаяся от Haskell, это вывод типов.

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

Например, в Scala вам нужно написать это:

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

вместо

add x y = x + y

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

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

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

6 голосов
/ 13 мая 2011

Ну что они сводятся по Тьюрингу?

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

...