[Haskell-cafe] hackage trac broken

2012-01-15 Thread Joachim Breitner
Hi,

a Debian user tried to report a bug against cabal-install
(http://bugs.debian.org/655752) but the trac instance linked from the
Cabal homepage seems to be down:

http://hackage.haskell.org/trac/hackage/
Internal Server Error

TracError: IOError: [Errno 13] Permission denied: '/srv/trac/hackage/VERSION'

Is this known and will it be fixed?

Thanks,
Joachim

-- 
Joachim nomeata Breitner
Debian Developer
  nome...@debian.org | ICQ# 74513189 | GPG-Keyid: 4743206C
  JID: nome...@joachim-breitner.de | http://people.debian.org/~nomeata


signature.asc
Description: This is a digitally signed message part
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


[Haskell-cafe] Installing dph-examples in Mac OS X Version 10.7.2

2012-01-15 Thread mukesh tiwari
Hello all
I am trying to install dph-examples on Mac OS X. First I have Xcode 4.2.1
and during the installation i got this http://hpaste.org/56445 error


Installing library in
/Users/mukesh/.cabal/lib/dph-seq-0.5.1.1/ghc-7.2.1Registering
dph-seq-0.5.1.1...Downloading dph-examples-0.5.1.2...Configuring
dph-examples-0.5.1.2...Building dph-examples-0.5.1.2...Preprocessing
executable 'dph-sumsq-seq' for dph-examples-0.5.1.2...[1 of 5]
Compiling SumSquaresVectorised (
imaginary/SumSquares/dph/SumSquaresVectorised.hs,
dist/build/dph-sumsq-seq/dph-sumsq-seq-tmp/SumSquaresVectorised.o
)Error (fd:12: hGetLine: end of file)Warning: Couldn't figure out LLVM
version!Make sure you have installed LLVMghc: could not execute:
optcabal: Error: some packages failed to install:dph-examples-0.5.1.2
failed during the building phase. The exception was:ExitFailure 1


On 
stackoverflowhttp://stackoverflow.com/questions/8864696/installing-dph-examples-in-mac-os-x-10-7-2
, i got suggestion to remove Xcode 4.2 and install Xcode 3.2. After
installing Xcode 3.2  , I am still getting this error.

Macintosh:~ mukesh$ cabal install dph-examples
Resolving dependencies...
Configuring dph-examples-0.5.1.2...
Building dph-examples-0.5.1.2...
Preprocessing executable 'dph-sumsq-seq' for dph-examples-0.5.1.2...
[1 of 5] Compiling SumSquaresVectorised (
imaginary/SumSquares/dph/SumSquaresVectorised.hs,
dist/build/dph-sumsq-seq/dph-sumsq-seq-tmp/SumSquaresVectorised.o )
Error (fd:11: hGetLine: end of file)
Warning: Couldn't figure out LLVM version!
Make sure you have installed LLVM
ghc: could not execute: opt
cabal: Error: some packages failed to install:
dph-examples-0.5.1.2 failed during the building phase. The exception was:
ExitFailure 1

Macintosh:~ mukesh$ uname -a
Darwin Macintosh 11.2.0 Darwin Kernel Version 11.2.0: Tue Aug  9 20:56:15
PDT 2011; root:xnu-1699.24.8~1/RELEASE_I386 i386

Macintosh:~ mukesh$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 7.2.1

Xcode 3.2 ( 64 bit )

Could some one please tell me how to resolve this issue.
Regards
Mukesh Tiwari
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] function composition

2012-01-15 Thread Mike Burns
What you've actually defined is function application.

Function composition has a different type:

  (.) :: (b - c) - (a - b) - a - c

(I'd read this as: compose takes a function from b to c, a function from
a to b, and something of type a, and produces a c.)

You ran into an order of operations issue that masked this bug:

  p . q 4  /= (p . q) 4 

Since you're working through this I don't want to give away the actual
definition of function composition, but be sure to follow the type.

On 2012-01-15 16.17.24 +0100, TP wrote:
 Hi,
 
 I have a basic question concerning function composition. I have used 
 http://www.haskell.org/tutorial/functions.html
 to write a composition function:
 
 Prelude let f�g = f g
 Prelude let p = (*2)
 Prelude let q = (+3)
 Prelude p�q 4
 14
 Prelude :t (�)
 (�) :: (t1 - t) - t1 - t
 
 If I understand well, this means that the infix operator � takes a function 
 of type t1, i.e. g in f�g, and applies f on it, which takes a type t1 as 
 input 
 and returns f(g) which is of type t. The final result is of type t. So the 
 first 
 argument is represented above by (t1-t), and the second by t1, the final 
 result being of type t.
 
 However, I am not able to get the type of p�q
 
 Prelude :t p�q
 
 interactive:1:3:
 Couldn't match expected type `Integer'
 with actual type `Integer - Integer'
 In the second argument of `(�)', namely `q'
 In the expression: p � q
 Prelude 
 
 What's the problem here? How can I obtain the type of p�q?
 
 Thanks in advance,
 
 TP
 
 ___
 Haskell-Cafe mailing list
 Haskell-Cafe@haskell.org
 http://www.haskell.org/mailman/listinfo/haskell-cafe

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] function composition

2012-01-15 Thread Daniel Fischer
On Sunday 15 January 2012, 16:17:24, TP wrote:
 Hi,
 
 I have a basic question concerning function composition. I have used
 http://www.haskell.org/tutorial/functions.html
 to write a composition function:
 
 Prelude let f°g = f g

This does not what you probably expect. That definition means (°) = ($) is 
just function application, or, in other words, (°) is the identity function 
restricted to function types.

If I'm correct in suspecting you want function composition,

Prelude let f°g = f . g
Prelude let (°) = (.)
Prelude let (f ° g) x = f (g x)

are possible ways to obtain that.

 Prelude let p = (*2)
 Prelude let q = (+3)

These two lead to the surprise below.

 Prelude p°q 4

This is parsed as

 p ° (q 4)

 14
 Prelude :t (°)
 (°) :: (t1 - t) - t1 - t

(°) is the identity restricted to function types.

 
 If I understand well, this means that the infix operator ° takes a
 function of type t1, i.e. g in f°g,

it may be a function, but need not, it could also be a non-function value 
like [], True, ...

 and applies f on it, which takes a
 type t1 as input and returns f(g) which is of type t. The final result
 is of type t. So the first argument is represented above by (t1-t),
 and the second by t1, the final result being of type t.
 
 However, I am not able to get the type of p°q
 
 Prelude :t p°q
 
 interactive:1:3:
 Couldn't match expected type `Integer'
 with actual type `Integer - Integer'
 In the second argument of `(°)', namely `q'
 In the expression: p ° q
 Prelude
 
 What's the problem here?

1. The monomorphism restriction. You have bound p and q

Prelude let p = (*2)
Prelude let q = (+3)

with simple pattern bindings (plain variable name, no function arguments in 
the binding) and without type signature. The inferred most general type for 
both is

Num a = a - a

which is a constrained polymorphic type.

The monomorphism restriction (language report, section 4.5.5) says such 
bindings must have a monomorphic type.

By the defaulting rules (section 4.3.4), the type variable is defaulted to 
Integer to obtain a monomorphic type. Hence in your session, you have

p, q :: Integer - Integer

Now, (°) :: (a - b) - a - b, and matching p's type with the type of 
(°)'s first argument, a = b = Integer. But if we try to match q's type with 
the type of (°)'s second argument, that type has already been determined to 
be Integer here, so q's type (Integer - Integer) doesn't match.

2. Even with the monomorhism eliminated, by one (or more) of

a) binding p and q with a function binding (let p x = x * 2)
b) giving a type signature for the binding
c) disabling the MR (Prelude :set -XNoMonomorphismRestriction)

you still get something probably unexpected. now

p :: Num a = a - a
q :: Num b = b - b

unifying p's type with the type of (°)'s first argument,

(p °) :: Num a = a - a

Now we must unify a with q's type, thus

(p ° q) :: (Num b, Num (b - b)) = b - b

 How can I obtain the type of p°q?

Eliminate the MR from the picture.

 
 Thanks in advance,
 
 TP


___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


[Haskell-cafe] SBLP - call for papers

2012-01-15 Thread Simon Thompson



 CALL FOR PAPERS

 16th BRAZILIAN SYMPOSIUM ON PROGRAMMING LANGUAGES

   Natal, Rio Grande do Norte, Brazil
   September 24-28, 2012
 http://www.cbsoft.dimap.ufrn.br




IMPORTANT DATES

Paper abstract submission (15 lines): April 20nd, 2012
Full paper submission: April 27th, 2012
Notification of acceptance: May 28th, 2012
Final papers due: June 29th, 2012

INTRODUCTION

The 16th Brazilian Symposium on Programming Languages, SBLP 
2012, will be held in Natal, Brazil, on September 24-28, 
2012. SBLP provides a venue for researchers and 
practitioners interested in the fundamental principles and 
innovations in the design and implementation of programming 
languages and systems.

The symposium will be part of the 3nd Brazilian Conference 
on Software: Theory and Practice, CBSoft 2012, 
http://www.cbsoft.dimap.ufrn.br, which will host four 
traditional, well-established symposia:

* XXVI Brazilian Symposium on Software Engineering (SBES)
* XVI Brazilian Symposium on Programming Languages (SBLP)
* XV Brazilian Symposium on Formal Methods (SBMF)
* VI Brazilian Symposium on Components, Software 
Architecture and Software Reuse (SBCARS)

SBLP 2012 invites authors to contribute with technical 
papers related (but not limited) to:

* Program generation and transformation, including domain-
specific languages and model-driven development in the 
context of programming  languages.

* Programming paradigms and styles, including functional,
object-oriented, aspect-oriented, scripting languages, 
real-time, service-oriented, multithreaded, parallel, and 
distributed programming.

* Formal semantics and theoretical foundations, including 
denotational, operational, algebraic and categorical.

* Program analysis and verification, including type systems, 
static analysis and abstract interpretation.

* Programming language design and implementation, including 
new programming models, programming language environments, 
compilation and interpretation techniques.

SUBMISSIONS

Contributions should be written in Portuguese or English. We 
solicit papers that should fall into one of two different 
categories: full papers, with at most 15 pages, or short 
papers, with at most 5 pages. All papers should be prepared 
using the SBC template. In particular, we encourage the 
submission of short papers reporting on partial results of 
on-going master dissertations or doctoral theses. All 
accepted papers will be published in the conference
proceedings.

Submissions should be done using SBLP 2012 installation of 
the EasyChair conference mangement system at
http://www.easychair.org/conferences/?conf=sblp2012.

As in previous editions, a journal special issue, with 
selected papers from accepted contributions, is anticipated.

GENERAL CO-CHAIRS

Nélio Cacho, UFRN
Gibeon Aquino, UFRN
Martin Musicante, UFRN

PROGRAMME CHAIRS

Francisco Heron de Carvalho Junior, UFC
Luis Soares Barbosa, Univ. do Minho

PROGRAMME COMMITTEE

* Alberto Pardo, Univ. de La Republica
* Alex Garcia, IME
* Alvaro Freitas Moreira, UFRGS
* André Rauber Du Bois, UFPel
* Andre Santos, UFPE
* Carlos Camarao, UFMG
* Christiano Braga, UFF 
* Fernando Castor Filho, UFPE   
* Fernando Quintão Pereira, UFMG
* Francisco Heron de Carvalho Junior, UFC (co-chair)
* Joao Saraiva, Universidade do Minho
* João F. Ferreira, Teeside University
* Jonathan Aldrich, Carnegie Mellon Univ.
* Jose Luiz Fiadeiro, Univ. of Leicester
* Lucilia Figueiredo, UFOP
* Luis Soares Barbosa, Univ. do Minho
* Manuel António Martins, Univ. de Aveiro
* Marcelo A. Maia, UFU
* Marcello Bonsangue, Leiden Univ/CWI
* Marcelo d'Amorim, UFPE
* Marco Tulio Valente, UFMG
* Mariza A. S. Bigonha, UFMG
* Martin A. Musicante, UFRN
* Noemi Rodriguez, PUC-Rio
* Paulo Borba, UFPE
* Peter Mosses, Swansea University
* Qiu Zongyang, Beijing University
* Rafael Dueire Lins, UFPE
* Renato Cerqueira, PUC-Rio
* Ricardo Massa, UFPE
* Roberto S. Bigonha, UFMG
* Roberto Ierusalimschy, PUC-Rio
* Sandro Rigo, UNICAMP
* Sergio Soares, UFPE
* Simon Thompson, Univ. of Kent
* Varmo Vene, Univ. de Tartu


Simon Thompson | Professor of Logic and Computation 
School of Computing | University of Kent | Canterbury, CT2 7NF, UK
s.j.thomp...@kent.ac.uk | M +44 7986 085754 | W www.cs.kent.ac.uk/~sjt


___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] hackage trac broken

2012-01-15 Thread Bas van Dijk
On 15 January 2012 12:01, Joachim Breitner nome...@debian.org wrote:
 Is this known and will it be fixed?

It was shut down because of massive spamming:

http://www.haskell.org/pipermail/cabal-devel/2012-January/008427.html

I have no idea who's working on it and when it will be up again.

Cheers,

Bas

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


[Haskell-cafe] bindings for libvirt

2012-01-15 Thread Michael Litchard
Due to the direction things are going at work, I have become
interested in Haskell bindings for libvirt. Noticed that this hasn't
been done yet. I was wondering if this was due to lack of motivation,
or if there were some difficult hurdles with libvirt that make the
project cost-prohibitive. If it's the former, I don't see a problem
proceeding with exploration. If it's the latter, I'd like to know what
the hurdles are.

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] hackage trac broken

2012-01-15 Thread Erik de Castro Lopo
Bas van Dijk wrote:

 On 15 January 2012 12:01, Joachim Breitner nome...@debian.org wrote:
  Is this known and will it be fixed?
 
 It was shut down because of massive spamming:
 
 http://www.haskell.org/pipermail/cabal-devel/2012-January/008427.html
 
 I have no idea who's working on it and when it will be up again.

Aw gee! Now I'm going to get blamed for shutting down the hackage trac
when all I did was report spam on it.

Erik
-- 
--
Erik de Castro Lopo
http://www.mega-nerd.com/

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] bindings for libvirt

2012-01-15 Thread Erik de Castro Lopo
Michael Litchard wrote:

 Due to the direction things are going at work, I have become
 interested in Haskell bindings for libvirt. Noticed that this hasn't
 been done yet.

Interesting!

 I was wondering if this was due to lack of motivation,
 or if there were some difficult hurdles with libvirt that make the
 project cost-prohibitive.

Well there are already Ocaml bindings for libvirt

http://libvirt.org/ocaml/

so its most likely the former.

Erik
-- 
--
Erik de Castro Lopo
http://www.mega-nerd.com/

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] bindings for libvirt

2012-01-15 Thread Michael Litchard
That's encouraging!

On Sun, Jan 15, 2012 at 1:41 PM, Erik de Castro Lopo
mle...@mega-nerd.com wrote:
 Michael Litchard wrote:

 Due to the direction things are going at work, I have become
 interested in Haskell bindings for libvirt. Noticed that this hasn't
 been done yet.

 Interesting!

 I was wondering if this was due to lack of motivation,
 or if there were some difficult hurdles with libvirt that make the
 project cost-prohibitive.

 Well there are already Ocaml bindings for libvirt

    http://libvirt.org/ocaml/

 so its most likely the former.

 Erik
 --
 --
 Erik de Castro Lopo
 http://www.mega-nerd.com/

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


[Haskell-cafe] HaskellWiki upload failed

2012-01-15 Thread Henk-Jan van Tuyl


L.S.,

I am trying to upload a file of about 12 Mbyte to the HaskellWiki; the  
upload fails without error message. Is the file too big?


Regards,
Henk-Jan van Tuyl


--
http://Van.Tuyl.eu/
http://members.chello.nl/hjgtuyl/tourdemonad.html
Haskell programming
--

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] bindings for libvirt

2012-01-15 Thread Erik de Castro Lopo
Michael Litchard wrote:

 That's encouraging!

In fact, since FFI bindings are usually easier in GHC Haskell than
in Ocaml, you should have it done by the end of the week :-).

Cheers,
Erik
-- 
--
Erik de Castro Lopo
http://www.mega-nerd.com/

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] feed release plan

2012-01-15 Thread Conrad Parker
On 14 January 2012 04:05, Johan Tibell johan.tib...@gmail.com wrote:
 On Fri, Jan 13, 2012 at 10:46 AM, Simon Michael si...@joyful.com wrote:
 Aha, thanks both.

 The haskell organisation looks bigger, I think I'd like to upload feed
 there. Could the owner add contact info or a how-to-join note to the page ?

 The Haskell organization on GitHub is for core libraries (i.e. the
 Haskell Platform) only at this point. It exists to make it easier for
 a few maintainers to maintain all those libraries.

haskell-pkg-janitors on the other hand is for non-core packages that
have become unmaintained and need a bit of love, but you don't
necessarily want to commit to long-term maintenance. The idea is that
anyone in the group is welcome to upload a new release.

I've added you on the off-chance you want to upload things there :)

Conrad.

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


[Haskell-cafe] Functor0?

2012-01-15 Thread Evan Laforge
Often when I define some type that wraps something else, I find myself writing
a function like the following:

newtype Thing = Thing X
liftThing f (Thing x) = Thing (f x)

It's like a Functor, but I can't make it an instance because Functor
requires that the type be parametric.  So I've been using type families to
make a kind of 0 argument functor:

class Functor0 a where
type Elem a :: *
fmap0 :: (Elem a - Elem a) - a - a

instance Functor0 Thing where
type Elem Thing = X
fmap0 = liftThing

Is there a name for this?  A better way to do it?

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] Functor0?

2012-01-15 Thread Tony Morris
On 01/16/2012 03:26 PM, Evan Laforge wrote:
 Often when I define some type that wraps something else, I find myself writing
 a function like the following:

 newtype Thing = Thing X
 liftThing f (Thing x) = Thing (f x)

 It's like a Functor, but I can't make it an instance because Functor
 requires that the type be parametric.  So I've been using type families to
 make a kind of 0 argument functor:

 class Functor0 a where
 type Elem a :: *
 fmap0 :: (Elem a - Elem a) - a - a

 instance Functor0 Thing where
 type Elem Thing = X
 fmap0 = liftThing

 Is there a name for this?  A better way to do it?

 ___
 Haskell-Cafe mailing list
 Haskell-Cafe@haskell.org
 http://www.haskell.org/mailman/listinfo/haskell-cafe
?
http://hackage.haskell.org/packages/archive/newtype/0.2/doc/html/Control-Newtype.html
?

-- 
Tony Morris
http://tmorris.net/



___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] Monad-control rant

2012-01-15 Thread Edward Z. Yang
Hello Mikhail,

Sorry, long email. tl;dr I think it makes more sense for throw/catch/mask to
be bundled together, and it is the case that splitting these up doesn't address
the original issue monad-control was designed to solve.

~ * ~

Anders and I thought a little more about your example, and we first wanted to
clarify which instance you thought was impossible to write.

For example, we think it should be possible to write:

instance MonadBaseControl AIO AIO

Notice that the base monad is AIO: this lets you lift arbitrary AIO
operations to a transformed AIO monad (e.g. ReaderT r AIO), but no more.
If this is the instance you claimed was impossible, we'd like to try 
implementing
it.  Can you publish the full example code somewhere?

However, we don't think it will be possible to write:

instance MonadBaseControl IO AIO

Because this lets you leak arbitrary IO control flow into AIO (e.g. forkIO, with
both threads having the ability to run the current AIO context), and as you 
stated,
you only want to allow a limited subset of control flow in.  (I think this was
the intent of the original message.)

Maybe client code doesn't want to be attached to AIO base monads, though;
that's too restrictive for them. So they'd like to generalize a bit.  So let's
move on to the issue of your typeclass decomposition.

~ * ~

I don't think it makes too much sense have thing pick off a menu of
Abort/Recover/Finally from a semantics perspective:

 It's easy to imagine monads that have an instance of one of the classes but
 not of the others

I'd like to see some examples.  I hypothesize that most of such monads are
incoherent, semantically speaking.  For example, what does it mean to have a
monad that can recover exceptions, but for which you can't throw exceptions?
There only a few options:

- You have special primitives which throw exceptions, distinct from
  Haskell's IO exceptions.  In that case, you've implemented your own
  homebrew exception system, and all you get is a 'Catch MyException'
  which is too specific for a client who is expecting to be able
  to catch SomeExceptions.

- You execute arbitrary IO and allow those exceptions to be caught.
  But then I can implement Throw: I just embed an IO action that
  is throwing an exception.

- You only execute a limited subset of IO, but when they throw exceptions
  they throw ordinary IO exceptions.  In this case, the client doesn't
  have access to any scarce resources except the ones you provided,
  so there's no reason for him to even need this functionality, unless
  he's specifically coding against your monad.

What does it mean to not have a Finally instance, but a Recover and Throw
instance?  Well, I can manually reimplement finally in this case (with or
without support for asynchronous exceptions, depending on whether or not Mask
is available): this is how the paper does it (finally is not a primitive.)

What does it mean to have a monad that can throw exceptions, but not catch them?
This is any of the usual monads that can fail, of which we have many.  And of 
course,
you can't allow this in the presence of scarce resources since there is no way 
to
properly deallocate them when exceptions are thrown.  So it seems this is just 
ordinary
failure which cannot be used in the presence of arbitrary IO.

What does it mean to have all of the above, but not to have a mask instance?
One approach is to pretend asynchronous exceptions do not exist.  As you do in 
your
example, we can simply mask.  I think this is a bit to give up, but I'll 
concede it.
However, I don't think it's acceptable not to provide mask functionality, not 
mask
your interpreter, and allow arbitrary IO.  It's now impossible to properly 
implement
many patterns without having subtle race conditions.

So it seems we should collapse these into one class, which conveniently maps 
straight
to the semantics defined in Asynchronous Exceptions in Haskell.

class MonadAsyncExc m where
mask :: ((forall a. m a - m a) - m b) - m b
throw :: SomeException - m ()
catch :: m a - (SomeException - m a) - m a

But you get to have your cake and eat it too: if you define a monad which is 
guaranteed
to be run with asynchronous exceptions masked, you can define the 'mask' 
function
to be a no-op and not violate any laws! Hooray!

But this is in fact what MonadCatchIO was, except that MonadCatchIO was
formulated when we still had block/unblock and it required MonadIO.  So a
useful endeavour would be to punt the MonadIO superclass constraint and fix the
definitions, and we have something that is usable to your case.

  ~ * ~

To contextualize this whole discussion, recall the insiduous problem that
*motivated* the creation of monad-control.  Suppose that we've done all of the
hard work and lifted all of the Control.Exception functions to our