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

标签 metaprogramming sml smlnj algebraic-data-types

我想知道是否有任何方法可以创建一个函数,给定一个名称/标识符列表,例如[Monday, Tuesday, ...],自动创建一个数据类型 day = Monday |星期二 | ... 和 next 函数,下周一 = 星期二下星期二 = 星期三,...保留(并反射(reflect))标识符的顺序在列表中。我知道我可以手动完成此操作,但我想知道数据类型声明是否可以在函数内实现。如果这在 SML 中不可能,那么哪些语言(最好是函数式语言)允许这样做?

最佳答案

这在标准机器学习中是不可能的。 (在某些实现中,您实际上可以使用 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 提供了许多元编程工具。

关于metaprogramming - 如何在SML中自动构造有序数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52671996/

相关文章:

recursion - SML - 使用延续在 trie 中收集单词

c++ - 用于函数对象的 noexcept 运算符总是产生 true

ruby - DelegateClass 和类似方法存在于哪个对象/类上?

ruby-on-rails - 为什么这些方法不通过define_method在运行时动态定义?

data-structures - 二项式堆上的正确功能实现

functional-programming - SML:读取一行整数时出现异常

ruby-on-rails - ruby 中的字符串到方法/函数调用?

recursion - 与递归数据类型的统一

sml - 查看 SML 完整列表

int - 如何在 SML 中将 String 转换为 int(而不是 int 选项)