Я очень новичок в 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
, являются примитивными типами.