如何自动在SML中构造有序数据类型

时间:2018-10-05 19:13:17

标签: metaprogramming sml smlnj algebraic-data-types

我想知道在给定names / identifiers的列表中,是否有任何方法可以创建一个函数,例如[Monday, Tuesday, ...]自动创建一个datatype day = Monday | Tuesday | ...和下一个函数,以使next Monday = Tuesdaynext Tuesday = Wednesday,...保留(并反映)列表中标识符的顺序。我知道我可以手动完成此操作,但是我想知道函数中是否可以进行数据类型声明。如果在SML中无法做到这一点,那么哪些语言(最好是功能性)可以做到这一点?

1 个答案:

答案 0 :(得分:3)

这在标准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 class,它提供了succ函数。 (Show类仅在此处,以便我们可以打印结果。)deriving是Haskell编译器内置的一种临时机制,但是GHC提供了许多元编程功能。