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

StackOverflow https://stackoverflow.com/questions/1815503

  •  07-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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, такие как типы ранга n, семейства типов и полиморфизм видов.

В Haskell модуль представляет собой набор типов и функций, но модули не являются объектами первого класса. Последствия предоставляются классами типов, но они имеют глобальную область видимости после

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top