在尝试用 Scala 中的代数数据类型描述 Sql 的一部分时,我遇到了创建表示数据类型的根特征的子特征的必要性。由于满足此要求产生了一个我不确定是否可以用 Haskell 的 ADT 表示的代码,并且由于与 Haskell 不同,ADT 不是 Scala 的本机构造,我现在想知道:
- 我是对的,在 Haskell 中不可能表示一个模型,例如一个
Sql
具有“子类型”的类型,并且在 HaskellStatement
中有一个构造函数吗?(似乎这可能是相关的)。Select
- 如果是这样,术语“ADT”是否适用于我生成的代码?
- 如果是的话,这是否使 Scala 在这方面实际上比 Haskell 更强大?
- 如果没有,这个功能没有在 Haskell 中实现的原因是什么?这让我觉得我的模型中的事情可能过于复杂
这是我正在谈论的模型:
sealed trait Sql
sealed trait Statement
extends Sql
sealed case class Union
( left : Statement,
right : Statement )
extends Statement
sealed case class Select
( /** other fields don't matter **/
where : Where )
extends Statement
sealed trait Where
extends Sql
sealed case class And
( left : Where,
right : Where )
extends Where
sealed case class Or
( left : Where,
right : Where )
extends Where
sealed case class Equals
( /** fields don't matter **/ )
extends Where