Avendo un'idea di what the Comonad typeclass is in Haskell, ho sentito parlare della comonad Store. Ma guardando Control.Comonad.Store.Lazy, non capisco davvero. Cosa significa? Cosa serve? Ho sentito che Store = CoState, il doppio della Monade di Stato. Cosa significa?Qual è la comonad Store?
risposta
È molto più semplice se si guarda la definizione di StoreT itself.
Si può pensare a un "luogo" in una struttura più grande. Ad esempio, uno lens è solo a -> Store b a
; si ottiene il valore del campo b e una funzione b -> a
per reinserire un nuovo valore nel contesto più ampio.
Considerando nella sua forma semplificata, non trasformatore:
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
cioè duplicate
cambia il s -> a
in un s -> Store s a
che restituisce solo il luogo "aggiornata" dopo la sostituzione del valore, e extract
ripristina l'originale un inserendo il valore nella struttura più grande.
Per quanto riguarda il suo rapporto con Stato va, si poteva guardare in questo modo:
type State s a = s -> (a, s)
type Store s a = (s -> a, s)
Data la seguente definizione di negozio,
data Store s a = Store { peek :: s -> a, pos :: s }
Mi piace pensare di un Store
come un grande magazzino pieno di valori di tipo a
. Ogni valore di tipo a
viene inserito in una posizione contrassegnata da un valore di indice di tipo s
. Finalmente c'è un carrello elevatore parcheggiato in posizione pos
. Il carrello elevatore può essere utilizzato a extract
un valore di tipo a
dal negozio estraendo il valore da dove è parcheggiato. È possibile utilizzare seek
per spostare il carrello elevatore su una nuova posizione assoluta o utilizzare seeks
per spostare il carrello elevatore in una nuova posizione relativa. Per aggiornare tutti i valori del negozio utilizzare fmap
. Infine extend f
è simile a fmap
eccetto che in sostituzione diabbiamo f :: Store s a -> a'
che consente alla funzione di aggiornamento non solo di accedere al valore in fase di aggiornamento, ma anche di accedere alla posizione del valore e accedere ai valori di tutto il resto del negozio. In altre parole, extend
utilizza il valore e il contesto circostante per eseguire l'aggiornamento.
Un'analogia più computerizzata sarebbe quella di pensare a un Store
come un grande piatto di un disco rigido con valori memorizzati in varie posizioni, oltre a una testa parcheggiata in una particolare posizione.
- 1. Comonad funzione
- 2. Qual è la differenza tra la distribuzione ad hoc e la distribuzione app store in ios
- 3. Qual è la differenza tra no-cache e no-store in Cache-control?
- 4. Qual è la risposta dell'app Windows RT/Windows Store ad App.config?
- 5. Qual è la differenza tra un data store e un database?
- 6. Qual è la magia dietro CAReplicatorLayer?
- 7. Quali benefici ottengo dalla creazione di un'istanza di Comonad
- 8. Esiste un termine per una monade che è anche una comonad?
- 9. Qual è la cultura invariabile?
- 10. Qual è la chiave = lambda
- 11. Qual è la cartella .idea?
- 12. In IndexedDB, qual è la differenza tra IDBObjectStore.put e IDBCursor.update?
- 13. qual è la differenza tra _source e _all in Elasticsearch
- 14. Qual è la differenza tra le edizioni Orientdb?
- 15. Qual è la differenza tra l'evento CoreWindow.GetForCurrentThread(). SizeChanged e Window.Current.SizeChanged
- 16. Qual è il vantaggio di un Key-Value Store su Bigtable?
- 17. Qual è il modo migliore per accedere al redux store all'esterno di un componente di reazione?
- 18. Qual è la differenza tra questa chiamata asincrona in EF?
- 19. Qual è la migliore implementazione di react shouldComponentUpdate con immutable.js
- 20. Play Store - Stato pronto per la pubblicazione
- 21. Quartz Scheduler - Qual è il diff tra RAM e JDBC Job Store
- 22. È richiesta la versione ipad per la pubblicazione su Apple Store?
- 23. Store IPv6 nella banca dati
- 24. Qual è l'equivalente per SecureString in WinRT?
- 25. Qual è la posizione: utile per?
- 26. Preferenze Android: qual è la differenza?
- 27. Qual è la differenza tra = e: =
- 28. Qual è la tua classe più riusata?
- 29. Qual è la DLL di interoperabilità?
- 30. Qual è la condizione preferita nel ciclo?
Giusto per espandere la connessione tra Stato e Negozio, tutte le monadi derivano da una composizione di funzioni aggiuntive. È comunemente noto che i functors '(r -> _)' (aka Reader) e '(_, r)' (anche capovolto, ma non si adatta alla solita presentazione di State in Haskell, e non può essere un Istanza di Functor in Haskell) sono aggiunti, e se li componi in un modo ('s -> (_, s)') otterrai una monade, e se li componi nell'altro modo ('(s -> _, s) ') otterrai una comonad. – copumpkin
@copumpkin: È '(_, r)' che non può essere un Functor, non è vero? '(r, _)' è solo 'instance Functor ((,) r)'. – ehird
Sì, scusate, ho erroneamente commentato questa parentesi :) – copumpkin