Hello,

There's a prelude function called asTypeOf which might help here:
asTypeOf :: a -> a -> a
asTypeOf = const

You can use maxBound `asTypeOf` (fst3 . head $ elements)

Another option is GHC's scoped type variables, which you use by adding
a type signature to your pattern. See:
http://www.haskell.org/ghc/docs/latest/html/users_guide/type-extensions.html#scoped-type-variables

- Cale

On 22/05/06, Brian Hulley <[EMAIL PROTECTED]> wrote:
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
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

Reply via email to