我想知道是否有任何方法可以创建一个函数,给出一个names
/ identifiers
列表,例如[Monday, Tuesday, ...]
,自动创建一个datatype day = Monday | Tuesday | ...
和一个函数,使next Monday = Tuesday
,next Tuesday = Wednesday
,......保留(并反映)列表中标识符的顺序。我知道我可以手动执行此操作,但我想知道函数中是否可以使用数据类型声明。如果在SML中这是不可能的,那么允许这些的一些语言(最好是功能性的)是什么?
这在标准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编译器内置的ad-hoc机制,但GHC提供了许多元编程工具。