[Haskell-cafe] Problem trying to get class Bounded to work

Brian Hulley brianh at metamilk.com
Mon May 22 18:37:27 EDT 2006


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. 



More information about the Haskell-Cafe mailing list