對what the Comonad typeclass is in Haskell有一些想法,我聽說過Store的comonad。但看着Control.Comonad.Store.Lazy,我真的不明白。這是什麼意思?它是爲了什麼?我聽說Store = CoState是State Monad的雙重身份。那是什麼意思?什麼是商店comonad?
34
A
回答
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 -> a
爲s -> Store s a
剛更換後的值返回「更新」的地方,extract
恢復原始一個將該值放回到較大的結構中。
至於它關係到國家的話,你可以看看這樣的:
type State s a = s -> (a, s)
type Store s a = (s -> a, s)
33
鑑於專賣店的如下定義,
data Store s a = Store { peek :: s -> a, pos :: s }
我喜歡把一個Store
作爲一個大型倉庫填充了a
類型的值。 a
類型的每個值都被分割到由s
類型的索引值標記的位置。最後有一輛叉車停在pos
的位置。叉車可用於extract
價值a
從商店通過拉出值從它停放的地方。您可以使用seek
將叉車移動到新的絕對位置,或使用seeks
將叉車移動到新的相對位置。要更新商店的所有值,請使用fmap
。最後extend f
類似於fmap
,除了替代f :: a -> a'
我們有f :: Store s a -> a'
它允許更新函數不僅可以訪問正在更新的值,還可以訪問該值的位置並訪問存儲中其他所有值的值。換句話說,extend
使用該值加上其周圍的上下文來執行更新。
一個更加計算機的比喻是將Store
想象成一個硬盤的大盤,存儲在不同位置的值以及停放在特定位置的頭部。
相關問題
- 1. mongoengine-什麼是referencefield商店
- 2. 什麼是bigcartel商店的「checkout complete」URL?
- 3. 什麼是原子商店類型?
- 4. 使用商店comonad表現康威的生活遊戲
- 5. 小商店,爲什麼DVCS?
- 6. NonEmpty不是Comonad?
- 7. 爲什麼不是autoLoad的商店項目數量是0?
- 8. 爲什麼在商店中使用TUI?
- 9. Magento網站,商店和商店視圖之間有什麼區別?
- 10. MS Foodmart數據庫 - 商店銷售與商店成本有什麼區別?
- 11. 防止代碼更改商店狀態的原因是什麼?
- 12. 爲什麼我的redux商店不是不可變的?
- 13. 什麼是必須有功能的網上商店(購物車)
- 14. 它是什麼樣的控制?在Windows商店應用程序
- 15. 如何找出我的商店ID是什麼?
- 16. Ext JS - 克隆進出商店的最佳方式是什麼?
- 17. 應用商店中的HTTPS - 過程是什麼?
- 18. 連接商店時Mobx.inject Mobx.observer的主要區別是什麼?
- 19. Windows證書商店的好處是什麼?
- 20. 在Django商店中定價的正確方法是什麼?
- 21. 什麼是關鍵商店和如何實施谷歌地圖
- 22. 什麼是蘋果應用商店提交的權威清單?
- 23. 文檔商店的最佳用途是什麼?
- 24. 什麼是多商店的最佳解決方案?
- 25. 爲什麼omniauth需要OpenID提供商的商店?
- 26. Schema.org商店是否適合在線商店?
- 27. WP8日曆商店像聯繫商店
- 28. 商店vs商店<T>
- 29. 什麼是「商品軟件」?
- 30. ||是什麼運營商呢?
爲了擴大國家和商店之間的聯繫,所有單子都來自伴隨函子的組合。衆所周知,函子'(r - > _)'(又名Reader)和'(_,r)'(翻轉過來也可以,但不適合Haskell中通常的狀態表示,並且不能成爲Haskell中的Functor實例)是伴隨的,如果你以單向方式('s - >(_,s)')構造它們,你將得到一個monad,如果你用另一種方式構造它們('(s - > _ s)')你會得到一個comonad。 – copumpkin 2012-01-08 04:24:33
@copumpkin:它不能是Functor的'(_,r)',不是嗎? '(r,_)'只是'實例Functor((,)r)'。 – ehird 2012-01-08 06:07:15
是的,對不起,我錯誤地編輯了那個括號內的評論:) – copumpkin 2012-01-12 03:57:29