I know just enuf about existential types in Haskell to be dangerous. While
trying to learn a little more about how to use them, I keep running into
problem. The existential types work great for code that I constructed if the
functions take a single argument. However, if the function takes more than
one argument, I can't seem to figure out how to get them to work.
In the test code below, everything compiles in Hugs (hugs98-Feb2001) except
the last line in the instance declaration (setx). Is there something
fundamental that I'm missing about how to create an existential instance
and/or data declaration - given the listed class definition?
module Test
where
class Shape a where
getx :: a -> Int
setx :: a -> Int -> a
data ExistentialShape =
forall a. Shape a => MakeExistentialShape a
instance Shape ExistentialShape where
getx (MakeExistentialShape a) = getx a
setx (MakeExistentialShape a) newx = setx a newx
-- here's the error message I get when I try to :load the module
ERROR test.hs:14 - Type error in instance member binding
*** Term : setx
*** Type : ExistentialShape -> Int -> _12
*** Does not match : ExistentialShape -> Int -> ExistentialShape
*** Because : cannot instantiate Skolem constant
Thanks,
Chris Rathman
- Re: Existential Type Declarations in Hugs Critterrathman
- Re: Existential Type Declarations in Hugs Marcin 'Qrczak' Kowalczyk
- Re: Existential Type Declarations in Hugs Critterrathman
- Re: Existential Type Declarations in Hugs Mark Carroll