12

Я изучаю различные функциональные языки в течение некоторого времени, включая Haskell, Scala и Clojure. Haskell имеет очень строгую и четко определенную систему статического типа. Scala также статически типизирован. Clojure, с другой стороны, динамически типизируется.Функциональное программирование и системы типов

Так что мои вопросы

  1. Какую роль играет система игры типа на функциональном языке?
  2. Нужно ли, чтобы язык имел систему типов, чтобы она была функциональной?
  3. Как «функциональный» уровень языка связан с типом системы языка?

ответ

39

Язык не должен быть набран быть функциональным - в сердце функционального программирования является lambda calculus, который поставляется в нетипизированных и typed вариантов.

Система типа играет две роли:

  • предоставляет гарантию на время компиляции, что класс ошибок не может возникнуть во время выполнения. Класс ошибок обычно включает в себя такие вещи, как попытка добавить две строки вместе или попытку применить целое число как функцию.
  • имеет некоторые преимущества в отношении эффективности, в том, что объекты во время выполнения не должны переносить свои типы, потому что типы уже установлены во время компиляции. Это называется type erasure.

В продвинутых системах типа, как Haskell, система типа может обеспечить больше преимуществ:

  • перегрузки: с помощью одного идентификатора для обозначения операций на различных типах
  • это позволяет библиотеку автоматически выбирает (с использованием Type Families)
  • позволяет проверять мощные инварианты во время компиляции, такие как инвариант в красно-черном дереве (с использованием Generalised Algebraic Datatypes)
+1

Эти расширенные функции, по сути, не ограничены функциональными языками. – sepp2k

+1

@ sepp2k true - можете ли вы подумать о системной функции типа, которая * ограничена функциональными языками? –

+0

Нет. Поэтому я бы не сказал, что между «функциональным уровнем языка» и системой типов существует большая связь. – sepp2k

2
  1. же, как и в любом языке программирования: это поможет вам избежать/найти ошибки в коде. В случае статической типизации система хорошего типа предотвращает компиляцию программ с определенными типами ошибок.
  2. untyped lambda calculus - это то, что вы могли бы назвать прототипом функциональных языков программирования, и это, как следует из названия, полностью нетипизировано.
  3. В функциональном языке (а также на любом другом языке, где функция может использоваться как значение) система типов должна знать, каков тип функции. Помимо этого нет ничего особенного в системах типов для функциональных языков.

    В чисто функциональном языке вам необходимо абстрагироваться от побочных эффектов, поэтому вы хотите, чтобы система типов каким-то образом могла ее поддерживать. Например, если вы хотите иметь такой тип мира, как в «Чистом», вам нужно, чтобы система типов поддерживала типы уникальности для обеспечения правильного использования.

    Если вы хотите иметь монаду IO, например, в haskell, вам нужен тип ввода-вывода (хотя у монады-типа, как у haskell, не требуется иметь IO-монаду, поэтому вам не нужна система типов, который поддерживает это).

+0

Вы имеете в виду, что нет никакой разницы между «функциональным» уровнем языка, который статически или динамически набирается? –

+2

@ abhin4v: Я уверен, что вы подразумеваете под «функциональным уровнем» – sepp2k

14

Какую роль система типа играет на функциональном языке?

Для превосходного ответа Саймон Марлоу, я хотел бы добавить, что тип системы, особенно тот, который включает в себя алгебраические типы данных, упрощает написание программ:

  • конструкции программного обеспечения, что в объекте Ориентированные языки иногда выражаются с использованием UML-диаграмм, которые очень четко выражены с использованием типов. Эта ясность проявляется особенно тогда, когда не только значения имеют типы, но также и модули имеют типы, как и в Objective Caml или Standard ML.

  • Когда человек пишет код, пара простых эвристических сделать это очень, очень легко писать чистые функции на основе типов:

    • Значение типа функции всегда могут быть созданы с помощью лямбда ,
    • Значение типа функции всегда можно использовать, применяя его.
    • Значение типа алгебраических данных может быть создано путем применения любого из конструкторов типа.
    • Значение типа алгебраических данных может быть использовано путем тщательного анализа его с помощью выражения case.

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

    forall a . (a -> Bool) -> [a] -> Bool 
    

    Искусства использования типов для создания коды называется типа направленного программирования. Когда он работает хорошо, вы слышите, как функциональные программисты говорят такие вещи, как «Как только мы получили типы правильно, код сам написал сам». Поскольку типы обычно намного меньше кода , это большая победа.

1

1: То же, как и любой другой, он останавливает вас от выполнения операций, которые либо плохо определены, или результатом которого будет «бессмысленные» для человека. Подобно добавлению float для целых чисел.
2: Нет, самый старый язык программирования в мире, (нетипизированное) лямбда-исчисление, является функциональным и нетипизированным.
3: Вряд ли функциональность просто означает отсутствие побочных эффектов, отсутствие мутаций, ссылочную прозрачность и т. Д.

Просто помните, что самый старый функциональный язык, нетипизированное исчисление лямбда не имеет системы типа.

Смежные вопросы