[Haskell-cafe] Monad layering and DSL

Gautier DI FOLCO gautier.difolco at gmail.com
Sun Jan 25 22:29:27 UTC 2015


2015-01-25 22:47 GMT+01:00 Tom Ellis <
tom-lists-haskell-cafe-2013 at jaguarpaw.co.uk>:

> On Sun, Jan 25, 2015 at 10:39:48PM +0100, Gautier DI FOLCO wrote:
> > 2015-01-25 9:37 GMT+01:00 Tom Ellis <
> > tom-lists-haskell-cafe-2013 at jaguarpaw.co.uk>:
> >
> > > On Sat, Jan 24, 2015 at 07:46:52PM +0100, Gautier DI FOLCO wrote:
> > > > data ImapF next =
> > > >          Select DirectoryName (Maybe DirectoryDescription -> next)
> > > >        | Noop (DirectoryDescription -> next)
> > > >        | Search MailSearch (Maybe [UID] -> next)
> > > > -- Functor instance
> > > > type Imap = Free ImapF
> > > >
> > > > searchAll :: Imap (Maybe [UID])
> > > > searchAll = liftF $ Search undefined id
> > > > select :: DirectoryName -> Imap (Maybe DirectoryDescription)
> > > > select directory = liftF $ Select directory id
> > > >
> > > > My main problem is the following: if I do a select of an unknown
> > > directory,
> > > > I should stop the computation.
> > >
> > > What do you mean you "should stop the computation"?  Do you mean the
> > > interpretation of the free monad should be forced to stop?  If so,
> doesn't
> > > making the type of the `Select` constructor
> > >
> > >     Select DirectoryName (DirectoryDescription -> next)
> > >
> > > achieve this?  That way if the interpreter talks issues a select
> command to
> > > the server and fails to receive a `DirectoryDescription` in return
> then it
> > > is forced to stop.
> >
> > If I do it this way, the evaluation is forced to be stopped, I have no
> way
> > to react to this error.
>
> Could you explain more precisely what you are trying to achieve, perhaps
> with an example?
>
> Tom
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>

In fact I'm looking for a practical way to alter Imap to change it
temporarily or not, globally or locally in a failable monad.

Example:

select "Unknown" -- will fail
doSomethingUnrelated

failableLessMode
select "Unknown" -- will fail
doSomethingUnrelated -- unreached expression
-- or
select "Unknown" <!!> $ do-- will fail
  doSomethingUnrelated -- unreached expression

where <!!> :: Imap (Maybe a) -> (a -> Imap b) -> Imap (Maybe b)

Is it clearer?
Please let me know.

Thanks.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20150125/86efc1ff/attachment.html>


More information about the Haskell-Cafe mailing list