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

Я сказал бы Полосу приветы из списка тогда разделенный пространством, поместив list.first () как имя, list.last (), поскольку фамилия тогда присоединяется к остатку пространством и имеет это как второе имя. И, ПРЕЖДЕ ВСЕГО, отобразите свои результаты и позвольте пользователю изменить их!

62
задан chollida 29 November 2009 в 20:03
поделиться

2 ответа

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

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

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

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

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

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

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

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

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

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

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

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

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

96
ответ дан 24 November 2019 в 16:48
поделиться

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

6
ответ дан 24 November 2019 в 16:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: