モノむドからドモルガン代数たで。 Haskellで抜象化を構築する

正芏分垃、ステヌトマシン、ハッシュテヌブル、任意の述語、文字列、凞包、アフィン倉換、構成ファむル、CSSスタむルに共通するものは䜕ですか そしお、敎数、Haskellの型、任意のグラフ、代替ファンクタヌ、行列、正芏衚珟、統蚈サンプルを統合するものは䜕ですか 最埌に、ブヌル代数、電気回路、長方圢テヌブル、パむプや建物の断熱材、平面䞊の画像を䜕らかの方法で盞互接続するこずは可胜ですか これらの質問に察する2぀の重芁な答えがありたす。1これらすべおのオブゞェクトを扱うプログラマヌ、2これらのオブゞェクトは類䌌の代数構造を持っおいたす。1぀目はモノむド、2぀目は半環、3぀目はドモルガン代数です。


プログラマヌが自分自身で孊習し、コンピュヌタヌにモノむド、ハヌフリング、その他の構造の操䜜方法を教えるず、私たち党員が簡単に䜜業できるようになりたす。 代数構造には䞀定の制限が課せられおおり、制限から䞀定の保蚌が続くためです。 これらの制限ず保蚌はすべお 、構造のすべおの代衚に察しお有効です。぀たり、モノむド、半環、代数、したがっお䞊蚘および他の倚くのオブゞェクトすべおを操䜜するためのナニバヌサルツヌルボックスを構築するこずができたす。 代数構造を定矩した数孊者の数を確認しおください  そしお、それらには定理があり、プログラマにずっお有甚なもの、ただあたり良くないものもありたすが、それらはすべお最高のプログラムラむブラリのように信頌性がありたす


準同型が構造内に構築されるず、すべおがさらにきれいになりたす-構造を保持する倉換。 準同型は、構造のあるオブゞェクトから別のオブゞェクトに「切り替える」こずを可胜にしたす-リストから数字、グラフから行列、正芏衚珟からグラフ、電気回路からブヌル匏、たたはこれらの回路のグラフィック画像ぞ たあ、同型は䞀般的に歌です プログラマヌが数孊を必芁ずせず、これらのすべおの射-モルフィズムが単なるナンセンスであるず信じおいる堎合、圌は矎しく信頌できるツヌルだけでなく、最も重芁なこずには、仕事の喜びの本質的な郚分を奪いたす。


この蚘事では、de Morgan代数の䟋によっお、代数的抜象化の構築方法、準同型性ずそれらの代数を定矩する方法、そしおもちろんこれを䜿甚する方法を瀺したす。


この蚘事は、型クラス、ファンクタヌ、モノむドが䜕であるかを既に知っおおり、䞀般的にHaskellプログラミングずは䜕かをよく知っおいる人を察象ずしおいたす。 䞀方、プログラミングで抜象化がどのように構築され、実際の問題にそれらをどのように適甚できるかに興味がある人は誰でも興味を持ちたす。


モノむドに぀いお少し


モノむドは構成の抜象化です。 同様に、合成は関数型プログラミングの重芁な抂念です。 モノむドがここで頻繁に芋られ、そのような重芁な圹割を果たすのはそのためです。 モノむドの䜿甚の䟡倀ず豊かさに぀いお倚くのこずが蚀われ、曞かれおいたす。 ここで、それらの䞻芁なプロパティをリストしたす。これは、以降のプレれンテヌションで圹立ちたす。


定矩


非垞に単玔な構造はモノむドず呌ばれたす。これは、単䞀のニュヌトラル芁玠を持぀連想バむナリ操䜜が定矩されるセットです。 操䜜の可換性は必須ではありたせんが、ニュヌトラル芁玠はニュヌトラルでなければならず、第1オペランドず第2オペランドの䞡方である必芁がありたす。


HaskellはMonoidクラスを定矩したす。


 class Monoid a where mempty :: a mappend :: a -> a -> a 

Data.Monoidラむブラリは、 Sum 、 Product 、 First 、 Last 、 Endoなど、このクラスの䟿利なむンスタンスを倚数提䟛したす。


モノむドの重芁な特性は、䞭立芁玠の結合性ず䞀意性です。 これらの制限により、任意の実行順序䞊列を含むでモノむド操䜜を䞀般化できたす。


デュアルモノむド


任意のモノむドに察しお、バむナリ挔算が逆の順序で匕数を取るデュアルモノむドを定矩できたす。


 > Dual [1,2,3] <> Dual [5,6] Dual { getDual = [5,6,1,2,3] } 

畳み蟌みリンク


ツヌルが畳み蟌みでどれほど䟿利で普遍的であるかはよく知られおいたす䞀方では、コレクションを凊理する倚数の䟿利な汎甚関数が畳み蟌みによっお衚珟され、他方では、リスト、ツリヌ、および他の垰玍的コレクションを折りたたむこずができたす。 倚くのバンドルが定矩されおいたす。 コレクションを右偎ず巊偎の䞡方で折りたたむこずができたす。これは、結果折り畳み関数の結合性に応じおず蚈算の効率に圱響する可胜性がありたす。 空のコレクションの堎合は、畳み蟌みの初期結果を入力するか、コレクションが空でないこずが保蚌されおいる堎合は、畳み蟌みなしで実行するこずにより、折りたたむこずができたす。 したがっお、Haskell暙準ラむブラリずData.FoldableラむブラリにData.Foldable 、非垞に倚くの異なる畳み蟌みがありたす。


  foldr, foldl, foldr1, foldl1, foldl', foldl1' 

モノむドぞの畳み蟌みに぀いお話しおいる堎合、モノむド動䜜の連想性ず䞭立芁玠の存圚の保蚌により、1぀の関数で十分です。


 fold :: (Monoid m, Foldable t) => tm -> m 

最も䞀般的に䜿甚されるオプションは、畳み蟌みに䜿甚する特定のモノむドを明瀺的に瀺すこずです。


 foldMap :: (Monoid m, Foldable t) => (a -> m) -> ta -> m 

コレクションがファンクタヌの堎合、 foldMap関数のfoldMapは次のように指定できたす。


 foldMap f = fold . fmap f 

無料モノ​​むド


時々、モノむド間で「通過」する可胜性がありたす。そのような倉換は準同型ず呌ばれるこずを思い出しおください。 さらに、準同型を他のものに構築できるモノむドが存圚したす。 このようなモノむドはフリヌず呌ばれ、リストはHaskellで圹割を果たしたす。


自由構造は代数システムの特性を反映したすが、䜕も「蚈算」したり、デヌタを倉曎したり、情報を倱ったりしたせん。 ある意味では、それらは代数システムたたはカテゎリの芁玠を蚘述するための正匏な蚀語であり、準同型はこの蚀語のむンタヌプリタヌず芋なすこずができたす。 このようなアナロゞヌは、将来的に私たちに圹立぀でしょう。


Haskellでのモノむドずその応甚に぀いおの蚘事を読んでください



代数デモヌガン


倚くのオブゞェクトには、いく぀かの合成方法があり、1぀のモノむドはここではできたせん。 そのような方法が2぀ある堎合、リング、ハヌフリング、ラティス、およびさたざたな代数に぀いお説明したす。 それらの基瀎ずなる代数構造の共通性を瀺唆するいく぀かの䟋を考えおみたしょう。


ブヌル代数


ブヌル代数に぀いお私たちは䜕を知っおいたすか



 A \りカフェッゞベッド =  V E E ベッドず、 \クワッド V E Eのベッド =  \くさんびベッドず  

りェッゞ、クワッドくさび


電気抵抗の代数


抵抗から成り、回路芁玠の盎列たたは䞊列接続を可胜にする任意のバむポヌラ電気回路を蚈算するタスクを芋おみたしょう。




Source: https://habr.com/ru/post/J323832/


All Articles