2014-10-25 13 views
9

Ho appena indagato su FRP in Haskell (principalmente reactive-banana (testimonianze!)), E mi chiedo è comune per loro, e in caso di banana reattiva quale è la ragione per operare in IO monad invece di essere vincolato a MonadIO, o rven migliore, qualsiasi Monad (in modo da poter fornire il proprio stack)?Strutture FRP e IO

Mi sembra che sia dovuto alla messa a fuoco della programmazione GUI, in cui viene integrata con alcune librerie esistenti che operano in IO? Sarebbe possibile modificarlo in modo da poterlo integrare con lo stack monad personalizzato?

+0

Buona domanda, mi sono anche chiesto perché la banana reattiva abbia preso questa decisione. Hai dato un'occhiata a Yampa, hanno preso una strada diversa. – martingw

+0

No, non ancora. Ora mi chiedo se potrei semplicemente forzare la mia strada attraverso il codice sorgente di banana reattiva e cambiare ogni IO in 'MonadIO m' – Bartosz

risposta

4

Se ti stai chiedendo perché

reactimate :: Frameworks t => Event t (IO()) -> Moment t() 

si aspetta un evento con valori di tipo IO() invece di permettere per una monade personalizzato M() con instance MonadIO M, allora la risposta è questa:

In pratica, Monade personalizzato stack aggiunge solo effetti state/reader/writer alla monade base IO. Tuttavia, in teoria, è del tutto possibile aggiungere meccanismi di controllo di fantasia come coroutine o non determinismo. Non so come integrare lo stato interno derivante dai combinatori accumE con questi effetti più generali e non ho idea di cosa significhi per un evento accadere in un contesto non deterministico. Ecco perché reactimate è limitato a IO.

Se si dispone di uno stack monade personalizzato appartenente alla famiglia di stato/lettore/scrittore, di solito è possibile associarlo a un puro calcolo IO e utilizzarlo con reactimate. Se trovi che questo non funziona (penso che potrebbe esserci un problema), avrei bisogno di una descrizione più dettagliata della situazione concreta per essere in grado di aiutarti.

+0

Beh, il mio ragionamento era tale che se tu (seguendo l'esempio di slot machine) invocassi l'evento usando' funzione fire' che restituisce appena un'azione IO (ei gestori sono quindi anche azioni IO), quindi dovrebbe essere possibile farlo con altre monadi. Ovviamente non ho idea dei dettagli, quindi questa era solo la mia impressione ... – Bartosz

+0

Bene, puoi sempre usare 'liftIO' quando invochi un evento con' fire', se è questo che intendi. –