#2309: containers: specialize functions that fail in a Monad to Maybe
-------------------------------+--------------------------------------------
 Reporter:  ross               |          Owner:         
     Type:  proposal           |         Status:  new    
 Priority:  normal             |      Milestone:  Not GHC
Component:  libraries (other)  |        Version:  6.8.2  
 Severity:  normal             |     Resolution:         
 Keywords:                     |     Difficulty:  Unknown
 Testcase:                     |   Architecture:  Unknown
       Os:  Unknown            |  
-------------------------------+--------------------------------------------
Comment (by ross):

 Several container classes have types like
 {{{
 lookup :: (Monad m, Ord k) => k -> Map k a -> m a
 }}}
 and use fail to signal exceptional conditions.  This allows them to be
 used with a range of monads, e.g. [], IO and parser monads.  Some of these
 use the string passed to fail.  However the strings are not very useful,
 and probably shouldn't be exposed in production code:
 {{{
 Data.Map.lookup: Key not found
 Data.Map.lookupIndex: Key not found
 Data.Map.minViewWithKey: empty map
 Data.Map.maxViewWithKey: empty map
 Data.Map.minView: empty map
 Data.Map.maxView: empty map
 }}}
 The problem with this device is that depending on the monad, fail can be
 an ordinary value, an exception or a runtime error (the default). It
 complicates checking whether a program is safe, because it hides possible
 runtime errors among testable conditions.

 The proposal was to revert these types to the simpler
 {{{
 lookup :: (Ord k) => k -> Map k a -> Maybe a
 }}}
 No information would be lost, as each of these functions has only one use
 of fail -- the Maybe type describes the situation precisely.  As the
 initial "thing with zero and return", it can be lifted to any other.
 Several people argued that the non-Maybe case is rare, and explicitly
 marking use of a different monad is no bad thing.

 Changing the monad classes is not a possibility at this stage: we need to
 work with the classes as defined in Haskell 98.

 No-one defended the status quo, but Twan van Laarhoven and Dan Doel argued
 that if the constraint were changed from Monad to `MonadPlus`, one should
 be able to assume a safe fail, while avoiding the the need for lifting.
 At present, fail in STM and Seq use the default error, which could be
 changed.  Haskell 98 specifies the fail in IO as throwing an exception
 (the `MonadPlus` instance is in the mtl package).

 In favour of the proposal were: apfelmus, Conor !McBride, David Menendez,
 Don Stewart, Duncan Coutts, Iavor Diatchki, Isaac Dupree, Josef
 Svenningsson, Krasimir Angelov, Lennart Augustsson, Neil Mitchell, Ross
 Paterson.

 That's not consensus, but it is a substantial majority, and I think we've
 explored all the issues.

-- 
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/2309#comment:4>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
_______________________________________________
Glasgow-haskell-bugs mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs

Reply via email to