Каковы различия и сходства систем типа Scala и Haskell? - PullRequest
62 голосов
/ 29 ноября 2009

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

Как объяснить систему типов Хаскелла опытному специалисту по Scala? Что можно сделать в Haskell, что нельзя сделать в Scala?

Ответы [ 2 ]

96 голосов
/ 29 ноября 2009

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

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

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

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

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

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

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

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

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

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

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

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

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

6 голосов
/ 29 ноября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...