Я новичок в SML, и я хотел бы убедиться, что действительно знаю основы. В чем разница между типом и типом данных в SML и когда что использовать?
SML: разница между типом и типом данных
Ответы (3)
Объявления type
просто дают другое имя существующему типу. Объявление type t = int * int
просто означает, что теперь вы можете писать t
вместо int * int
— на самом деле это не обеспечивает никакой функциональности.
datatype
определения позволяют создавать совершенно новые типы, вводя новые конструкторы данных. Конструкторы данных — это ключевые слова и символы, которые вы используете для создания и сопоставления значений с образцом, таких как nil
и ::
типа списка. В этих идентификаторах нет ничего особенного; вы можете определить их самостоятельно так же легко, как это:
datatype 'a list = nil | :: of 'a * 'a list
nil
и ::
— это конструкторы data. Конструктор типа — это тип с параметрами, например. list
себя.
- person Andreas Rossberg; 05.02.2014
Типы данных в sml могут иметь более одного типа, например.
datatype a = SomeType | SomeOtherType
Вы можете использовать их при проверке типов, например.
fun doThings (var : a) : bool =
case var of
(SomeType) => true
(SomeOtherType) => false
Вы можете думать об этом так: типы предназначены для непрозрачных и атомарных типов, а datatype
— для типов с конструкторами и т. д., которые можно деструктурировать, в основном при сопоставлении с образцом в выражениях.
datatype
может также предоставлять представление простого типа, если он реализует непрозрачный тип (объявленный с помощью type
в сигнатуре и определенный как datatype
в структуре, реализующей сигнатуру).
Атомарные типы, такие как int
и word
, можно рассматривать как деструктурируемые типы в некотором отношении, как с арифметической интерпретацией чисел Пеано, но SML int
, word
и не так хорошо называемый real
являются примитивными типами.