[Haskell-cafe] Re: Generalizing IO

Heinrich Apfelmus apfelmus at quantentunnel.de
Wed Oct 7 07:24:44 EDT 2009


David Menendez wrote:
> Floptical Logic wrote:
>> The code below is a little interactive program that uses some state.
>> It uses StateT with IO to keep state.  My question is: what is the
>> best way to generalize this program to work with any IO-like
>> monad/medium?  For example, I would like the program to function as it
>> does now using stdin but I would also like it to function over IRC
>> using the Net monad from
>> <http://haskell.org/haskellwiki/Roll_your_own_IRC_bot>.  Thanks for
>> any suggestions.
> 
> Instead of specifying the monad implementation, specify the interface.
> That is, you are using state operations (from MonadState) and IO
> operations (from MonadIO). Try removing all the type signatures that
> mention PDState and see what you get.
> 
> E.g., loop :: (MonadState PD m, MonadIO m) => m a

Alternatively, you can use algebraic data types instead of type classes
to generalize one program to different implementations. For monads, this
can be achieved with

     http://hackage.haskell.org/package/MonadPrompt

In particular, the idea is to turn every effect like

  getLine

into a constructor

  GetLine

and have different implementations pattern match on that.


Regards,
apfelmus

--
http://apfelmus.nfshost.com



More information about the Haskell-Cafe mailing list