[compute heuristic in a lazy monad
Helmut Grohne <grohne@cs.uni-bonn.de>**20150303155854
 Ignore-this: cbc81498fc2290635af68d023e0c8634
 
 The heuristic is only used for debugging. Thus it should be computed lazily.
 However, it is computed in a strict monad. By swapping the monad for a lazy
 monad using mapReaderT we can gain an 8% speedup on the test suite.
] 
<
[make igor2 compile on ghc 7.4.2 and current hackages
Helmut Grohne <grohne@cs.uni-bonn.de>**20131217133624
 Ignore-this: ec4be18819806ae8821ae058e4cccda1
] 
[Replaced type ELT with newtype ELT; files depending on Logger.hs are still broken.
tobias@goedderz.info**20140716144805
 Ignore-this: 9a0a0c29c5d0558ab4848c597160c9a4
] 
[Fixed usages of lift on LM and ELT types
tobias@goedderz.info**20140717102434
 Ignore-this: 184c6a37204db852f905c6a87ecb9571
] 
[work around unhandled runtime error passing by catchError
Helmut Grohne <grohne@cs.uni-bonn.de>**20140108073945
 Ignore-this: 60b21165b086517cb697ed19c7fe368e
] 
[use throwError where possible
Helmut Grohne <grohne@cs.uni-bonn.de>**20140108091026
 Ignore-this: e06ab5b6869087360b7a19fc56a8c2c4
 Since the use of fail changed in past GHC releases, part of the code base now
 uses throwError instead. The biggest part is the introduction of an Error e
 requirement to many of the functions to be able to use throwError. As a side
 effect of this change, interactive igor2 no longer dies on a syntax error.
] 
[remove lots of MonadError constraints
Helmut Grohne <grohne@cs.uni-bonn.de>**20150123124916
 Ignore-this: 51e4f8ff1088b22454cc098cac37251
 
 Some uses of catchError result in a computation that definitely no longer
 transports an error. Still such uses were constrained by MonadError. By
 introducing a safeCatchErrorC function, we can escape from the MonadError into
 a weaker monad and elide these constraints in many places. Since
 safeCatchErrorC forces the MonadError on its first parameter to Either String,
 some of these computations practically change their monad. For instance,
 normalPat was living in the IO monad. Therefore, this change might induce
 semantic changes (for instance due to the use of fail in other places).
] 
[remove unused MonadPlus from various contexts
Helmut Grohne <grohne@cs.uni-bonn.de>**20150303153735
 Ignore-this: 1e0512fc845058f3ec3fdfce0b325d70
] 
> hunk ./src/Igor2/Data/Hypotheses.hs 25
+import Control.Monad.Identity (runIdentity)
+import Control.Monad.Reader (mapReaderT)
hunk ./src/Igor2/Data/Hypotheses.hs 195
-      heu                  <- heuristic h
+      heu                  <- mapReaderT (return . runIdentity) $ heuristic h