【发布时间】:2019-06-29 23:49:38
【问题描述】:
我想知道是否有可能(我猜是:))有递归求和类型,其中我们在每个级别上都有一个 X 类型的值,但是以某种方式限制我们自己,在每个递归级别上,我们都有不同的值X?
例如,如果我有
data MachineType = Worker | Flyer | Digger | Observer | Attacker
data Machine = Single MachineType | Multi MachineType Machine
类型系统将允许我构建具有以下类型的机器:
Multi Worker (Multi Worker (Single Worker))
但我希望对此进行限制,以便只允许使用不同的 MachineType-s。
有没有办法在类型系统中对此进行编码?
你可以给我指出正确的方向,因为我有点不知道用谷歌搜索什么:)(haskell set-like recursive sum types?)
【问题讨论】:
-
您可以使用一个幻像类型参数,它是 MachineTypes 的类型级别 HList,并使 Machine 成为 GADT,其中构造函数需要证明该列表不包含给定类型的机器
-
@sara 的评论当然是一种方法,但使用
Data.Set并执行newtype Machine = Machine { getMachines :: Set MachineType }不是更简单吗? -
感谢您的回答!我将研究 HList 和 GADT 以了解它们是如何工作的。我也在考虑系列,但想知道这是否可以“高于”一级。我想编码的内容类似于 'X with added Y' 并且 set 可以解释为 'X with added Y' 和 'Y with添加 X'。使用模式匹配,我首先需要处理“主要”事物,即 X,然后如果我愿意,再向下递归到它的其他组件。但如果我不知道其他解决方案是如何工作的,它绝对是一个选择:)
标签: haskell