2012-01-07 16 views
34

what the Comonad typeclass is in Haskellのアイデアを持って、私は店のコモナードについて聞いたことがあります。しかし、Control.Comonad.Store.Lazyを見ると、私はそれを実際には得られません。どういう意味ですか?それはなんのためですか?私はStore = CoStateというステートモナドの二重ということを聞いたことがある。どういう意味ですか?店舗コモナードとは何ですか?

答えて

30

StoreT itselfの定義を見ると、はるかに簡単です。

あなたはもっと大きな構造の「場所」と考えることができます。たとえば、lensはちょうどa -> Store b aです。 bフィールドの値を取得し、関数b -> aを使用して新しい値を大きなコンテキストに戻します。

data Store s a = Store (s -> a) s 

instance Functor (Store s) where 
    fmap f (Store g s) = Store (f . g) s 

instance Extend (Store s) where 
    duplicate (Store f s) = Store (Store f) s 

instance Comonad (Store s) where 
    extract (Store f s) = f s 

すなわちduplicateだけの値を交換した後、「更新」の場所を返しs -> Store s as -> aを変更し、extractは、元復元:

その単純化し、非トランスフォームでそれを考えるとを使用して、値を大きな構造に戻します。

限り、国家との関係が行くとして、あなたはこのようにそれを見て可能性:ストアの次の定義を考えると

type State s a = s -> (a, s) 
type Store s a = (s -> a, s) 
+15

StateとStore間の接続を拡張するだけで、すべてのモナドはadjoint functorのコンポジションから発生します。一般的には、ファンクター '(r - > _)'(別名Reader)と '(_、r)'(フリップされたものもありますが、ハスケルの国の通常の表示には適合しません。 HaskellのFunctorインスタンス)は随伴型であり、一方向( 's - >(_、s)')を作成するとモナドが得られ、逆に ' s) ')あなたはコモナードを手に入れます。 – copumpkin

+0

@copumpkin:それはFunctorではない '(_、r)'ですね。 '(r、_)'は単にインスタンスのFunctor((、)r)です。 – ehird

+0

ええ、申し訳ありませんが、私は括弧内の発言を間違って編集しました:) – copumpkin

33

data Store s a = Store { peek :: s -> a, pos :: s } 

私のようにStoreと考えたいです大きな倉庫には、タイプaの値が入っています。タイプaの各値は、タイプsのインデックス値でラベル付けされた位置にスロットされます。最後に、位置posに駐車されたフォークリフトがあります。フォークリフトは、extractに、店舗からのタイプaの値に、駐車場所から値を引き出すことによって使用することができます。 seekを使用してフォークリフトを新しい絶対位置に移動するか、seeksを使用してフォークリフトを新しい相対位置に移動できます。ストアのすべての値を更新するには、fmapを使用します。最後にextend ff :: a -> a'の代わりにf :: Store s a -> a'の代わりにfmapと似ています。更新機能は更新される値にアクセスするだけでなく、値の位置にアクセスし、ストア内の他の値にアクセスすることができます。換言すれば、extendは、値にその周囲のコンテキストを加えて更新を実行する。

より計算機的には、Storeは、さまざまな位置に値が格納されたハードディスクの大きなプラッタと、特定の位置に駐車されたヘッドと考えることです。