假设我有一个列表[A,B,C]。有没有什么方法可以基于该列表声明代数数据类型,具有以下语义:
data V = A | B | C
谢谢!
答案 0 :(得分:4)
你想要的是动态生成的抽象数据类型,这在使用ADT的任何语言中听起来都是非标准的。
你可以做的是拥有一个带有单个构造函数的数据类型,然后是一个所谓的智能构造函数,它会对可以传递给构造函数的值施加一些逻辑。
data PermList a = PermList ([a] -> Bool) [a]
permList :: ([a] -> Bool) -> [a] -> PermList a
permList f xs | f xs = PermList f xs
| otherwise = undefined