Каковы различия и сходства систем типа Scala и Haskell?

Как объяснить систему типа Scala специалисту Haskell? Какие примеры показывают преимущества Scala?

Как объяснить систему типа Haskell продвинутому практикующему Scala? Что можно сделать в Haskell, которое невозможно сделать в Scala?

Ответ 1

Scala Программисту Haskell:

Scala - строгий и нечистый язык с первоклассными модулями. Типы данных объявляются как "классы" или "черты" с незначительными отличиями, а модули или "объекты" - это значения этих типов. Scala поддерживает конструкторы типов, использующие универсально квантифицированные параметры типа. Объекты/классы/признаки имеют элементы, которые состоят из значений, изменяемых переменных и функций (называемых "методами", к которым модуль неявно передается как переменная с именем this). Модули могут иметь члены типа, которые также могут принимать параметры. Элементы типов экзистенциально квантуются, а параметры типа могут быть более высокого класса. Поскольку типы могут быть членами первоклассных значений, Scala обеспечивает вкус зависимого набора, называемый зависимые от пути типы.

Первоклассные функции также являются модулями. Функция - это модуль с методом apply. Метод не является первоклассным, но предоставляется синтаксис для обертывания метода в функции первого класса. К сожалению, модуль требует всех параметров своего типа спереди, поэтому частично примененная функция первого класса не может быть количественно определена. В более общем плане, Scala полностью не имеет прямого механизма для типов рангов выше 1, но модули, параметризованные на более высоких типах, могут быть использованы для имитации типов ранга n.

Вместо классов классов с глобальной областью, Scala позволяет объявить неявное значение любого заданного типа. Это включает в себя типы функций, которые обеспечивают неявное преобразование и, следовательно, расширение типа. В дополнение к неявным преобразованиям расширение типа обеспечивается механизмом "extends", который позволяет объявлять отношение подтипов/супертипов между модулями. Этот механизм можно использовать для моделирования алгебраических типов данных, где супертип можно рассматривать как тип в левой части объявления данных, а его подтипы - как конструкторы значений в правой части. Scala имеет расширенные возможности сопоставления шаблонов, используя виртуализированный шаблонный шаблон с первоклассными шаблонами.

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

Haskell для программиста Scala:

Haskell - чисто функциональный язык. Это означает, что функции вообще не имеют никаких побочных эффектов. Например, программа Haskell не выводит на экран как таковой, но является функцией, которая возвращает значение типа данных IO[_], которое описывает последовательность действий для подсистемы IO для выполнения.

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

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

Недавние расширения компилятора GHC позволяют использовать расширенные системные функции типа, не имеющие эквивалента в Scala, такие как типы ранга-типа, семейства типов и полиморфизм видов.

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

Так как Haskell не является "объектно-ориентированным", то нет дихотомии метода/функции. Каждая функция является первым классом, и каждая функция имеет значение по умолчанию (нет Function1, Function2 и т.д.).

Haskell не имеет механизма подтипа, но классы типов могут иметь отношение подкласса.

Ответ 2

Я не считаю, что кто-то систематически сравнивал Haskell (как иллюстрируется системой типа GHC) с Scalas. Основные отличия - степень вывода типа и поддержка типов более высокого ранга. Но полное рассмотрение различий было бы опубликованным результатом.