目標は、Haskell で新しく定義されたデータ型の新しいセミグループ型クラス インスタンスを作成することです ( Will Kurt による「Get Programming with Haskell」の本を知っている人のために、428 ページ、つまり capstone プロジェクトの終わりを参照してください)。 5 運動延長あり)。
新しく定義されたデータ型があります。
data HINQ m a b = HINQ (m a -> m b) (m a) (m a -> m a)
| HINQ_ (m a -> m b) (m a)
m
このデータ型は、コンテキスト (モナドまたは代替) を定義するSQL に似たクエリを指定します(m a -> m b)
。目的は SQL 関数SELECT
に似ています。つまり、データベースで見たいプロパティの種類を定義します(m a)
。前の関数を適用し (SQL のtable_nameに似ています)、最終的に(m a -> m a)
探しているプロパティを除外します (SQL の に似ていますWHERE
)。
私の目標は、このデータ型をセミグループ (そして最終的にはモノイド) のインスタンスにすることです。a
などに必要なすべてのセミグループ インスタンスb
が想定されていることに注意してください。
instance (Semigroup a, Semigroup (m a), Semigroup b,...) =>
Semigroup (HINQ m a b) where
(<>) (HINQ func1 start1 test1)
(HINQ func2 start2 test2) =
したがって、大まかなアイデア (より明確にするための背景) は、データベースへのいくつかの異なるクエリを単一のクエリに構成できるようにすることですが、2 つの異なる関数をマージする方法を思いつくことができませんでした。(m a -> m b)
同時に 1 つに入力して、2 つのテーブルをマージする(m a)
... 最初のアイデアは、それらをリストに結合することでしたが、その後、型シグネチャが変更されました。これに対する解決策はまだ見つかりません。