Каковы различия и отношения между конструкторами типов и типами данных? - PullRequest
0 голосов
/ 25 апреля 2020

В книге Уллмана по SML

  • 9.3.2 Конструкторы примитивного типа перечислены как конструкторы типов: ref, array и vector,

  • 9.3.3 Примитивные типы данных перечисляет как типы данных: bool, list, option и order.

  • 6.1.1 Просмотр системы типов ML перечисляет как конструкторы типов: list, option, ref, array и vector.

Вопросы:

  1. Являются ли lists и option типами данных, конструкторами типов или обоими?

  2. Каковы различия и отношения между конструкторами типов и типами данных? Меня смущают следующие цитаты:

    Глава 6 Определение ваших собственных типов говорит:

    Определения типов данных - это правила для создания новых типов с новыми значениями, которые не значения ранее определенных типов.

    2.4 Кортежи и списки говорит:

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

  3. Если конструкторы типов и типы данных могут перекрываться, то что такое Концепция, противоположная (взаимоисключающая) конструктору типов, и какая концепция (взаимоисключающая) противоположна типу данных?

Спасибо.

1 Ответ

1 голос
/ 25 апреля 2020

Я надеюсь, что этот ответ является разумным.

  1. list и option оба являются конструкторами типов, потому что они принимают (префиксный) тип для создания типа. Таким образом, int list является типом, но list сам является конструктором типа. То же самое касается option и int option и т. Д.

    В Haskell и, возможно, других типовых языках вы можете сказать, что int option имеет вид Type, тогда как option имеет вид Type -> Type. Виды относятся к типам, а типы - к значениям, как средство сказать обо всех них.

    Поэтому я считаю, что когда вы говорите «список - это тип», об этом говорят свободно. На самом деле вы имеете в виду «α list - это тип для любого типа α». Иногда вы имеете в виду «'a list - это тип», а 'a - это переменная типа. Разница в том, что под α я подразумеваю некоторый конкретный тип, а под 'a я подразумеваю некоторую переменную типа.

  2. Когда вы создаете тип данных, datatype troolean = True | False | Derp, тогда troolean тип и True, et c., являются (нулевыми) конструкторами значений.

    Когда вы создаете тип данных, datatype fiat = USD of int | ChildDrawing of png, тогда fiat является типом, а Dollar является конструктор значений с типом int -> fiat.

    Когда вы создаете тип данных, datatype ('a, 'b) either = Left of 'a | Right of 'b, тогда ('a, 'b) either является типом, either является конструктором типа (он принимает два параметра типа и создает тип , но свободно говоря, "либо является типом"), Left и Right все еще являются конструкторами значений.

    Я не уверен, что вас смущает в кавычках. Типы данных позволяют создавать новые типы с новыми значениями, которые не существуют (но тип, скорее всего, isomorphi c для некоторого типа, который существовал). Составление типов все еще возможно, но даже более мощно, потому что вы можете составлять типы, которые вы сделали сами, для большой точности и выразительности.

    Я полагаю, вы могли бы также назвать troolean конструктором нулевого типа, но это, вероятно, не смущайте, когда говорите, что troolean - это Type, а either - это ... что?

  3. Если конструкторы типов и типы данных может перекрываться

    Я не уверен, что вы можете сказать это. Типы данных определяют новые значения. Иногда эти значения имеют параметры значения. Иногда сам тип данных имеет параметры типа. Когда это так, его конструктор типов имеет более высокий вид.

...