SML: разница между типом и типом данных

Я очень новичок в SML, и я хотел бы убедиться, что я действительно знаю основы. В чем разница между типом и типом данных в SML и когда использовать, который?

Ответ 1

type объявления просто дают другое имя существующему типу. Объявление type t = int * int означает, что теперь вы можете писать t вместо int * int - на самом деле он не предоставляет никаких функций.

datatype позволяют создавать новые типы, вводя новые конструкторы данных. Конструкторы данных - это ключевые слова и символы, которые вы используете для создания и сопоставления шаблонов, такие как тип списка nil и ::. Нет ничего особенного в этих идентификаторах; вы можете определить их так же легко, как это:

datatype 'a list = nil | :: of 'a * 'a list

Ответ 2

Типы данных в sml могут иметь более одного типа, например

datatype a = SomeType | SomeOtherType

Вы можете использовать их при проверке типов, например

fun doThings (var : a) : bool =
    case var of
       (SomeType) => true
       (SomeOtherType) => false

Ответ 3

Вы можете думать об этом как о следующем: типы относятся к непрозрачным и атомным типам, а datatype относятся к типу с конструкторами и, таким образом, могут быть деструктурированы, в основном, при сопоставлении шаблонов в выражениях.

A datatype может также показать простой вид типа, если он реализует непрозрачный тип (объявлен с type в сигнатуре и определен как datatype в структуре, реализующей подпись).

Атомный тип типа int и word можно рассматривать как деструктурируемые типы в некотором отношении, например, с арифметической интерпретацией чисел Пеано, но SML int, word и не так хорошо называется real, являются примитивными типами.