Scala で代数データ型を使用して Sql の一部を記述しようとしているときに、データ型を表すルート トレイトのサブトレイトを作成する必要があることに気付きました。この要件を満たすと、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