2011-12-07 17 views
7

Sto scrivendo un trasformatore di flusso da un tipo di dati di input a un tipo di dati di output. L'input è fatto dall'utente, quindi c'è un po 'di tempo tra gli eventi. Poiché ogni input richiede il caricamento di alcune risorse, mi piacerebbe "guardare al futuro", cioè inviare tutti i possibili input alle principali risorse di computazione e precarico in base ai risultati.Ci sono monadi che possono essere usati come un automa?

Attualmente, c'è sempre esattamente un output dopo ogni input ma potrebbe eventualmente diventare interessante cambiarlo.

Sono riuscito a implementarlo con il trasformatore Automaton di Ross Paterson. Non sono sicuro che la mia soluzione sia ottimale.

  • Ci sono dei buoni esempi su come farlo? Forse anche con il codice di prova?
  • Può essere raggiunto anche con una monade? (Esempi ?, Spiegazione perché è impossibile?)

Edit: Dopo la richiesta di ulteriori specifiche, ho aggiunto il codice qui. Ora lo rimuovo (non era comprensibile) e aggiungo qualche altra spiegazione. La mia domanda viene risposto thaugh.

La mia intenzione era quella di arrestare il ciclo di eventi principale dopo ogni input dell'utente che è stato inviato al trasformatore di frecce/stream/qualunque. Quindi memorizzerebbe lo stato corrente dell'automa e invierà uno alla volta tutti gli input possibili (eventi falsi) all'automa e vedrà quali risorse devono essere caricate, per memorizzarle nella cache. Dopo il prossimo evento reale, userebbe la cache per una migliore reattività. Il calcolo principale non dovrebbe essere influenzato da questo.

+0

non qualificato per rispondere, ma le iterazioni potrebbero essere utili. Vedi questa libreria: http://hackage.haskell.org/package/enumerator ... ma le frecce sembrerebbero una buona astrazione. Scommetto che più specifiche potrebbero aiutare le persone a rispondere. – jberryman

+0

+1 su più specifiche. – sclv

risposta

8

Tutti i casi di utilizzo citati sono coperti dalla libreria Netwire. Fornisce una generalizzazione della freccia dell'automa di Ross a una famiglia di fili. Non ho ancora finito lo wiki page, ma dovrebbe darti abbastanza per iniziare.

Combinando questo con Kleisli (LogicT m) per alcuni monad m si ottengono fili non deterministici.

E come nota aggiuntiva: quello che vuoi non è una monade.

+1

Ciao Ertes! Puoi spiegare perché questa non è una monade? – Duschvorhang

+0

@Duschvorhang: le frecce sono una generalizzazione delle monadi. Vedi [Haskell wiki> arrow] (http://haskell.org/haskellwiki/Arrow) –

+0

@Duschvorhang: puoi vedere una limitazione simile nell'esempio di parser di §3.0 di John Hughes [Generalizing Monads to Arrows] (http: //www.ittc.ku.edu/Projects/SLDG/filing_cabinet/Hughes_Generalizing_Monads_to_Arrows.pdf) insieme a un'attenta spiegazione di come le frecce forniscono l'espressività necessaria. È una bella lettura, inoltre. – acfoltzer