0

目標は、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)... 最初のアイデアは、それらをリストに結合することでしたが、その後、型シグネチャが変更されました。これに対する解決策はまだ見つかりません。

4

1 に答える 1

2

私はあなたがしたくないと思いますSemigroupクエリのすべてのペアを構成するのは意味がありません。一方の出力タイプが他方の入力タイプと適切に一致するものだけです。幸いなことに、「型付き」バリアントSemigroup(実際には型付きMonoidですが、十分に近い) に対応する概念がありますCategory

また、クエリをクエリしているテーブルと組み合わせるのは設計ミスだと思います。それらは概念的には別個の概念です。実際、2 つのクエリを作成しても、テーブルは 2 つではなく 1 つしかありません。そう:

data HINQ m a b = HINQ (m a -> m b) (m a -> m a)

instance Category (HINQ m) where
    id = HINQ id id
    HINQ slct whr . HINQ slct' whr' = HINQ (slct . whr . slct') whr'

同一性法則は非常に明確ですが、right 節と leftWHERE節の使用の非対称性は少し疑わしいので、結合法則を注意深く確認する必要があります。

(HINQ s0 w0 . HINQ s1 w1) . HINQ s2 w2
= HINQ (s0 . w0 . s1) w1 . HINQ s2 w2
= HINQ (s0 . w0 . s1 . w1 . s2) w2
= HINQ s0 w0 . HINQ (s1 . w1 . s2) w2
= HINQ s0 w0 . (HINQ s1 w1 . HINQ s2 w2)

いいね!

編集

えっと、うーん... たぶん、x . id = x法律は結局それほど明確ではありません. うわぁ!含まれる関数の構成までの等価性のみを考慮しない限り、これはおそらく修正できません。そのCategory場合、関数のインスタンスを直接使用しないのはなぜですか? もちろん、あなたが持っている他のオプションは、アイデンティティ法が保持することを要求しないことです. これは少し珍しいことですが、これが妥当かどうかはユースケースに大きく依存すると思います。

の代わりにa -> Boolまたは など、フィルタリングをより明示的に表すと、構成が簡単になる場合があります。これにより、上記のインスタンスのようにフィルターの 1 つを選択操作にロールバックするのではなく、実装で 2 つのフィルターを組み合わせる機会が増えます。a -> m Boolm a -> m a(.)

于 2021-09-15T19:14:19.463 に答える