Как автоматически создавать упорядоченные типы данных в SML

Я хотел бы знать, есть ли способ создать функцию, которая, учитывая список names/identifiers, например. [Monday, Tuesday, ...] автоматически создает datatype day = Monday | Tuesday | ... и следующую функцию, так что next Monday = Tuesday, next Tuesday = Wednesday, ... сохраняют (и отражают) порядок идентификаторов в списке. Я знаю, что могу сделать это вручную, но мне было интересно, возможны ли объявления типов данных внутри функций. Если это невозможно в SML, какие языки (предпочтительно функциональные) позволяют это делать?


person Gepapado    schedule 05.10.2018    source источник
comment
Невозможно в SML (каков тип такой функции? Не существует типа SML, значения которого являются типами). Функции Python могут создавать классы, но, вероятно, это не так. недостаточно функционален для вас. Возможно, вас заинтересуют макросы Лиспа. В этом направлении, возможно, clojure (который основан на Лиспе, но более функционален) может иметь что-то. То, что вы пытаетесь сделать, вряд ли будет хорошо работать с выводом типа.   -  person John Coleman    schedule 05.10.2018


Ответы (1)


Это невозможно в стандартном ML. (В некоторых реализациях вы действительно можете записать файл и прочитать его во время выполнения, используя use, но это обычно не одобряется.)

Haskell может сделать это:

$ ghci
GHCi, version 8.0.1: http://www.haskell.org/ghc/  :? for help
Prelude> data Day = Mon | Tue | Wed | Thu | Fri | Sat | Sun deriving (Enum, Show)
Prelude> succ Mon
Tue
Prelude> succ Sun
*** Exception: succ{Day}: tried to take `succ' of last tag in enumeration
CallStack (from HasCallStack):
  error, called at <interactive>:5:62 in interactive:Ghci2

Предложение deriving указывает компилятору автоматически реализовать класс Enum, который предоставляет функцию succ. (Класс Show существует только для того, чтобы мы может распечатать результаты.) deriving — это специальный механизм, встроенный в компилятор Haskell, но GHC предоставляет множество средств метапрограммирования.

person Florian Weimer    schedule 05.10.2018
comment
Похоже, это не случай динамического получения списка и создания нового типа перечисления во время выполнения. - person John Coleman; 06.10.2018
comment
Я, очевидно, предполагал, что список был представлен во время компиляции. Может быть, вопрос неясен в этой части. - person Florian Weimer; 06.10.2018
comment
Сам вопрос не был ясен на этот счет. Ваш ответ - хороший ответ на одну интерпретацию (+1). - person John Coleman; 06.10.2018