リーダー、ライターモナド


17

してみましょうあることCCC。してみましょうの製品bifunctorも。通り猫が CCCである、我々はカレーできる:C(×)C(×)

curry(×):C(CC)

curry(×)A=λB.A×B

ファンクターカテゴリは、通常のモノイダル構造があります。CC でモノイド中モナドである。CCC 有限積をモノイド構造と見なします。C

curry(×)1id

A B.curry(×)(A×B)(curry(×)A)(curry(×)B)

したがって、はモノイド構造を保持するため、モノイドにモノイドを、コモノイドをコモナに輸送します。つまり、任意のモノイドをモナドに転送します(定義を見てくださいはモノイドでなければなりません)。同様に、それは輸送対角線comonoidCoreaderの comonadを。w W r i t e r w w(curry(×))w(Writer w)w

さて、具体性のために、Writerの構築を展開します。

ベギン。実際には、Haskellでは単に異なる名前を持っています。我々は持っているHaskellはモノイドWriter=Coreader=curry(×) w,mappend,mempty

mappend:w×ww

mempty:1w

ライターはファンクターなので、やなどの射もマップする必要があります。Haskellでは無効ですが、次のように記述します。m e m p t ymappendmempty

Writer mappend:Writer(w×w)Writer w

Writer mappendは自然な変換であり、射である。プロパティにより、それは関数でありを取り射を与えます:C U R R Y × A O B C CCCcurry(×)aOb(C)C

Writer mappend a=mappend×(id(a)):Writer(w×w)aWriter w a

非公式には、は、タイプコンポーネントを合計しそのままポンプます。これはまさにHaskellのWriterの定義です。1つの障害は、モナドに必要なことですw aWriter mappend awaWriter w,μ,η

μ:Writer wWriter wWriter w

すなわち、型の非互換性。しかし、これらのファンクターは同型です: a自然な同型である有限積の通常のアソシエー。次に、を定義します。私は建設省略経由。λ A W × W × A = W R I T E R W W R I T E R W μ W R I T E R M A P P EWriter(w×w)=λa.(w×w)×aλa.w×(w×a)=Writer wWriter wμη M 、E 、M 、P 、T 、YWriter mappendηmempty

ライターはファンクターであり、可換図を保存します。つまり、モノイド等式を保存します。したがって、 =のモノイドを =モナドの。終わり。C C CWriter w,μ,η(CC)C

何についてのリーダーとCowriter?Coreaderの定義で説明されているように、リーダーはCoreaderに付随しています。上記のリンクを参照してください。同様に、CowriterはWriterに付随しています。Cowriterの定義が見つからなかったので、表に示す類推でそれを作り上げました。

代替テキスト

{- base, Hackage.category-extras -}
import Control.Comonad
import Data.Monoid
data Cowriter w a = Cowriter (w -> a)
instance Functor (Cowriter w) where
    fmap f (Cowriter g) = Cowriter (f . g)
instance Monoid w => Copointed (Cowriter w) where
    extract (Cowriter g) = g mempty
instance Monoid w => Comonad (Cowriter w) where
    duplicate (Cowriter g) = Cowriter
        (\w' -> Cowriter (\w -> g (w `mappend` w')))

以下は、それらの(コ)モナドの簡略化された定義です。fr_ob Fはオブジェクト上のファンクターFのマッピングを示し、fr_mor Fは射型上のファンクターFのマッピングを示します。はモノイドオブジェクトがあります。Cw,+^,0^C

  • 作家
    • fr_ob(Writer w)a=a×w
    • fr_mor(Writer w)f=λa0,w2.a0,f w2
    • ηa=λa0.a0,0^
    • μa=λa0,w1,w0.a0,w0+^w1
  • 読者
    • fr_ob(Reader r)a=ra
    • fr_mor(Reader r)f=λg r0.f(g r0)
    • ηa=λa0 r0.a0
    • μa=λf r0.f r0 r0
  • コリーダー
    • fr_ob(Coreader r)a=r×a
    • fr_mor(Coreader r)f=λr0,a0.f r0,a0
    • ηa=λr0,a0.a0
    • μa=λr0,a0.r0,r0,a0
  • コライター
    • fr_ob(Cowriter w)a=wa
    • fr_mor(Cowriter w)f=λg r0.f(g r0)
    • ηa=λf.f 0^
    • μa=λf w1w0.f(w0+^w1)

問題は、の付属語がモナドではなくファンクターに関連していることです。「Coreader is comonad」「Reader is a monad 」および「Writer is a monad 」「Cowriter is comonad」という付属語の意味がわかりません。C

リマーク。より多くのコンテキストを提供するのに苦労しています。いくつかの作業が必要です。特に、カテゴリーの純度が必要な場合、それらの(コ)モナドはプログラマーに導入されました。しつこい!;)


オファー:テーブルのスクリーンショットを撮って、ここに画像を配置できます。
MS Dousti

ここに質問をコピーしてください。
デイブクラーク

2
人々は、その理由を説明するコメントを投稿する必要があります。
スレシュヴェンカト

1
@Ohad。私はその質問をより文脈的に提供しようとするためにその変更を導入したことを告白します(元々参照されていたブログ投稿で発見されたように)。たとえば、リーダーとライター、コリーダーとコライターがカテゴリー用語またはHaskell、あるいはその両方で定義されていることを定義することにより、ベロアは自分の質問を自己完結させるためにもっと努力するべきだと思います。
デイブクラーク

2
@beroal:私が意味したのは、Haskellを日常的に使用していないので、Haskellコードを解析してCTに移行することは私にとって、そしておそらく他の人にとっても簡単ではないということです。純粋に質的観点で質問を言い換えすることで、あなたは...迅速な答えを受ける可能性が高い
オハッドKammar

回答:


13

はい、モナドに右随伴Nがある場合、Nは自動的に共通構造を継承します。M:CCNN

これを理解するための一般的なカテゴリー理論の設定は次のとおりです。ましょう及びDは、二つのカテゴリーこと。書き込みF U NC DのためcategeoryからファンクタのCに対するD。そのオブジェクトはファンクターであり、その射は自然な変換です。書き込みF U N LC Dのの完全なサブカテゴリのためにF U NC D CDFun(C,D)CDFunL(C,D)Fun(C,D)正しい随伴を持つファンクターについて(言い換えれば、正しい随伴とそれらの間の任意の自然変換を持つファンクターを考慮します)。ファンクターF C Dの右随伴者にF RD Cと書く。次いで、- RF U N LC D F U ND C 反変ファンクタである:もしα F CDFR:DCF:CDR:FunL(C,D)Fun(D,C)次いで、誘導された天然の変換がある天然の変換である αのRG RF Rはα:FGαR:GRFR

場合、次いでF U NC Cは組成物によって与えられるmonoidal構造を有しており、そうF U N LC Dは左adjointsの組成が左随伴であるため、。具体的には、F G R = G R F R、そう- Rは antimonoidal反変ファンクタです。ファンクタMを装備する構造的自然変換にRを適用する場合C=DFun(C,C)FunL(C,D)(FG)R=GRFRRRM モナドの構造では、出てくるのはコモナドです。


1
そして、もう一つは、これらのファンクタのいくつかは、たとえばことを言及すべきである本当にファンクタではなく、唯一、最大の正準同型に、それは一般的に満たす関手ので擬似ファンクタのようなものではありません。それにもかかわらず、要点は有効です。R
アンドレイバウアー

7

ところで、これ:

してみましょうでの製品bifunctorもCCが CCCである、我々はカレーできる× (×)CC(×)

少し間違っています。1つは、通常の用語は(私が間違っていなければ)Cの上または上の二機能因子であるということです。「イン」は通常、カテゴリの矢印とオブジェクトを使用する構造を意味しますが、「オン」カテゴリのファンクターは、複数のカテゴリに関連する構造を指します。そして、製品のbifunctorは、デカルトカテゴリ内の構造ではありません。×C

そして、これはより大きな不正確さに関係します。製品の二機能をカリー化する能力は、がデカルト閉であるとは関係ありません。むしろ、カテゴリのカテゴリであるC a t(警告を挿入)がデカルト閉であるため可能です。そのため、問題のカレーは次のようになります。CCat

HomCat(C×D,E)HomCat(C,ED)

ここで、はカテゴリーの積であり、E DはファンクターのカテゴリーF D Eです。ただし、これは、CD、およびEがデカルト閉であるかどうかに関係なく機能します。私たちは聞かせたときC = D = Eを、我々が得ます:C×DEDF:DECDEC=D=E

c u r r y ×C C C

×:C×CC
curry×:CCC

しかし、これは単に次の特別な場合です。

c u r r y FC E D

F:C×DE
curryF:CED

2 Dan Doel:はい、はい、はい、ありがとう。オリジナルの投稿beroal.livejournal.com/23223.htmlから翻訳中に私は間違いをしました
ベロア

4

adjunctionを考えてみましょう。すべてのそのようadjunctionのために我々はモナド持っG F η G ε F ともcomonad F G ε F η Gを。特に、FGはエンドファンクターである必要はなく、一般的にはそうではありません(たとえば、リストモナドは、S e tM o nの間の無料ファンクターと忘却ファンクター間の付加ですF,G,ϵ,ηGF,η,GϵFFG,ϵ,FηGFGSetMon)。

そのため、読者(またはライター)を取得し、それを随伴ファンクターに分解して、モナドと対応するコモナを生成します。つまり、ReaderとCoreader(またはWriterとCowriter)の間の接続は、探しているものではないということです。

そして、それはようカリー化を考えるのは、おそらく良いでしょう、すなわちX Y { f X × A Y } { f X Y A }。または、それが役立つ場合、hom × A :hom(×A,=)hom(,=A)X,Y. {f:X×AY}{f:XYA}:hom(×A,=×1)hom(1,=A)


2 wren ng thornton:Setと代数構造のカテゴリーとの間の付属物に似たReaderとWriterの定義的な補助詞を知りません。または、すべてのモナドは、「MacLane。作業数学者のカテゴリ。VI。モナドと代数。 「?もっと具体的に教えてください。実際、私の質問は、これらの(コ)モナドをリストモナドのようにエレガントな言葉で定義しようとする試みの結論です。
ベロア

T

F:SetMonU:MonSetη:idSetUFϵ:FUidMonF,U,η,ϵUF,η,UϵFSetMonFU,ϵ,FηU

ファンクター(リーダーa)と(ライターa)は随伴であり、その付加は(状態a)モナドを生じさせます。
ベロア

「いいえ、私のポイントは、モナドとコモナドが「同じように」、すなわち、前述のように、付加によって発生するということでした」。SetとMonのカテゴリの付加からモナドとコモナを取得すると、Setでモナドを取得し、Monでコモナを取得します(異なるカテゴリ)。ただし、リーダーとライターは同じCCCカテゴリに属します。
ベロア
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.