在试图用Scala中的代数数据类型描述Sql的一部分时,我需要创建根trait的子trait来表示数据类型。由于遇到这个要求会产生一些代码,我不确定能否使用Haskell的ADT来表示,并且与Haskell不同,ADT不是Scala的本地构造,所以我现在想知道:
- 我是否正确认为在Haskell中无法表示模型,例如类型
Sql
具有“子类型”Statement
并具有构造函数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
case class A (a: Int); class B (b: Int) extends A(2)
- Nikita Volkov