Я хотел бы знать, есть ли способ создать функцию, которая, учитывая список names
/identifiers
, например. [Monday, Tuesday, ...]
автоматически создает datatype day = Monday | Tuesday | ...
и следующую функцию, так что next Monday = Tuesday
, next Tuesday = Wednesday
, ... сохраняют (и отражают) порядок идентификаторов в списке. Я знаю, что могу сделать это вручную, но мне было интересно, возможны ли объявления типов данных внутри функций. Если это невозможно в SML, какие языки (предпочтительно функциональные) позволяют это делать?
Как автоматически создавать упорядоченные типы данных в SML
Ответы (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
a>, который предоставляет функцию succ
. (Класс Show
существует только для того, чтобы мы может распечатать результаты.) deriving
— это специальный механизм, встроенный в компилятор Haskell, но GHC предоставляет множество средств метапрограммирования.
person
Florian Weimer
schedule
05.10.2018
Похоже, это не случай динамического получения списка и создания нового типа перечисления во время выполнения.
- person John Coleman; 06.10.2018
Я, очевидно, предполагал, что список был представлен во время компиляции. Может быть, вопрос неясен в этой части.
- person Florian Weimer; 06.10.2018
Сам вопрос не был ясен на этот счет. Ваш ответ - хороший ответ на одну интерпретацию (+1).
- person John Coleman; 06.10.2018
clojure
(который основан на Лиспе, но более функционален) может иметь что-то. То, что вы пытаетесь сделать, вряд ли будет хорошо работать с выводом типа. - person John Coleman   schedule 05.10.2018