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

问题描述 投票:2回答:1

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

metaprogramming sml smlnj algebraic-data-types
1个回答
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编译器内置的ad-hoc机制,但GHC提供了许多元编程工具。

© www.soinside.com 2019 - 2024. All rights reserved.