Brian Hulley wrote:
Hi -
I've got the following function which doesn't compile:

 createMonoMultiFont
     :: (MonadException m, Enum i, Bounded i)
     => [(i, Font, Colour)] -> m (MonoMultiFont i)
 createMonoMultiFont elements =
     liftIO . block $ do
          mmfRaw <- duma_MonoMultiFont_create (fromEnum (maxBound::i))
          mmfPtr <- newForeignPtr duma_MonoMultiFont_Release mmfRaw
          return $ MonoMultiFont mmfPtr

The problem is that ghc complains that there is no instance for
Bounded i even though I've written "Bounded i" in the type
declaration for the function.

Here is a gross hack that compiles:

createMonoMultiFont elements =
     liftIO . block $ do
         let
             (onei,_,_):_ = (undefined, undefined, undefined) : elements
             upper :: Bounded a => a -> a
             upper _ = maxBound
             last = upper onei

         mmfRaw <- duma_MonoMultiFont_create (fromEnum last)
         -- adding of elements to mmfRaw ommitted for clarity
         mmfPtr <- newForeignPtr duma_MonoMultiFont_Release mmfRaw
         return $ MonoMultiFont mmfPtr

Still, it would be nice to be able to just write (maxBound::i) since the dictionary for i is present in the result.

Brian.
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to