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