モノイド圏クラスについて次の定義があります(標準ライブラリに似ていますが、必要な自然同型の逆を提供します)。
class (Category r, Category s, Category t) => Bifunctor p r s t | p r -> s t, p s -> r t, p t -> r s where
bimap :: r a b -> s c d -> t (p a c) (p b d)
--
class (Bifunctor b k k k) => Associative k b where
associate :: k (b (b x y) z) (b x (b y z))
associateInv :: k (b x (b y z)) (b (b x y) z)
--
class (Bifunctor b k k k) => HasIdentity k b i | k b -> i
class (Associative k b, HasIdentity k b i) => Monoidal k b i | k b -> i where
idl :: k (b i a) a
idr :: k (b a i) a
idlInv :: k a (b i a)
idrInv :: k a (b a i)
--
を使用してモノイド圏で射を構成する際の問題(.)
は、オブジェクトが異なる方法で関連付けられる可能性があることです。ためにinstance
Monoidal Hask (,) ()
、我々は、タイプの射を構成することができますx -> ((a, b), c)
タイプの射で((a, ()), (b, c)) -> y
。タイプを適合させるには、によって与えられる自然同型をbimap idrInv id . associate
適用する必要があります。
Haskell型システムは、目的のドメインと終域タイプに基づいて、適切な同型を自動的に決定する方法を可能にしますか?どうすればいいのかわからない。
私はそれを理解しました、ある種。基本的な考え方は、正規化関数とその逆関数をメソッドとして持つマルチパラメーター型クラスを使用することです。ノーマライザーは、すべてを再帰的に右側に関連付けます。型クラスには、再帰の各ケースのインスタンスが必要です。次に、ある方法から別の方法に変換するには、最初の射のタイプのノーマライザーと2番目の射のタイプの逆ノーマライザーを作成します。
コードを公開したらすぐにここにリンクします。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加