Подтвердить что ты не робот

Что делает систему типа Haskell более "мощной", чем системы типов других языков?

Чтение Недостатки системы типа Scala по сравнению с Haskell?, я должен спросить: что это, в частности, делает систему типа Haskell более мощной, чем другие языки '(C, С++, Java). По-видимому, даже Scala не может выполнять некоторые из тех же полномочий, что и система типа Haskell. Что конкретно, что делает систему типа Haskell (вывод типа Хиндли-Милнера) настолько мощной? Можете привести пример?

4b9b3361

Ответ 1

Что это такое, в частности, что делает систему типа Haskell

В течение последнего десятилетия было разработано как гибкое, так и логическое для проверки свойств - и мощное.

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

То есть, Haskell/GHC обеспечивает логику, которая одновременно является мощной и предназначена для поощрения программирования уровня. Что-то довольно уникальное в мире функционального программирования.

Некоторые бумаги, которые придают аромат направления, которое инженерное усилие применяет в системе типа Haskell, взяли:

Ответ 2

Hindley-Milner - это не система типов, а алгоритм вывода типа. Система типа Haskell, вернувшаяся в тот же день, имела возможность быть полностью выведенной с использованием HM, но этот корабль долгое время плавал для современного Haskell с расширениями. (ML остается способным быть полностью выведенным).

Возможно, способность в основном или полностью выводить все типы дает силу с точки зрения выразительности.

Но в основном это не то, о чем я думаю, вопрос действительно о.

Документы, которые связаны с другим аспектом, указывают на то, что расширения системы типа Haskell завершают завершение (и что современные семейства типов делают этот полный язык обучения более похожим на программирование уровня ценности). Еще одна хорошая статья на эту тему - McBride Faking It: Моделирование зависимых типов в Haskell.

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

Ответ 3

Перейдем к очень простому примеру: Haskell Maybe.

data Maybe a = Nothing | Just a

В С++:

template <T>
struct Maybe {
    bool isJust;
    T value;  // IMPORTANT: must ignore when !isJust
};

Рассмотрим эти две сигнатуры функций в Haskell:

sumJusts :: Num a => [Maybe a] -> a

и С++:

template <T> T sumJusts(vector<maybe<T> >);

Отличия:

  • В С++ можно сделать больше ошибок. Компилятор не проверяет правило использования Maybe.
  • Тип С++ sumJusts не указывает, что для этого требуется + и отбрасывается из 0. Сообщения об ошибках, которые появляются, когда что-то не работает, являются загадочными и нечетными. В Haskell компилятор просто пожалуется, что тип не является экземпляром Num, очень простым.

Короче говоря, у Haskell есть:

  • ADTS
  • Тип-классы
  • Очень дружелюбный синтаксис и хорошая поддержка дженериков (которые в С++ люди стараются избегать из-за всех их криптокритичности)

Ответ 4

Язык Haskell позволяет писать безопасный код, не отказываясь от функциональности. Большинство языков в настоящее время торгуют функциями для безопасности: язык Haskell показывает, что возможно иметь оба.

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

Более того, система типа Haskell, наряду с ее ленивым по умолчанию и чистотой подход к кодированию, дает вам толчок в усложнении, но важны такие вопросы, как parallelism и concurrency.

Только мои два цента.

Ответ 5

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

Используя классы типов, очень легко определить очень абстрактные функции, которые по-прежнему полностью безопасны для типа - как, например, эта функция Фибоначчи:

fibs :: Num a => [a]
[email protected](_:xs) = 0:1:zipWith (+) fibs xs

Например:

map (`div` 2) fibs        -- integral context
(fibs !! 10) + 1.234      -- rational context
map (:+ 1.0) fibs         -- Complex  context

Вы можете даже определить свой собственный числовой тип для этого.