class instance with nested types
Andreas Rossberg
rossberg@ps.uni-sb.de
Fri, 27 Oct 2000 14:07:37 +0200
Matthias Höchsmann wrote:
>
> > type Sequence a = [a]
> > data Tree a = N a (Forest a) deriving (Ord,Eq,Show)
> > type Forest a = Sequence (Tree a)
>
> i want to construct a class Xy
>
> > class Xy s a where
> > test :: s a -> a
>
> [...]
>
> > instance ([] Tree) Char where
> > test x@(N a xs):txs = a
To make it syntactically correct this should at least be something like
> instance Xy ([] Tree) Char where
> test (N a xs:txs) = a
But the real problem is in the expression ([] Tree), which is the same
as writing [Tree]. This is not a legal type expression, since Tree is a
type constructor, not a ground type, so you cannot apply it to the list
constructor.
What you are trying to say is probably something like this:
> instance Xy (\a . [Tree a]) Char -- not Haskell
But unfortunately there are no lambdas on the type level - they would
render the type system undecidable. For the same reason it is not
allowed to use a type synonym in an instance declaration:
> instance Xy Forest Char -- illegal
The only thing you can do is turning Forest into a data type:
> data Tree a = N a (Forest a) deriving (Ord,Eq,Show)
> data Forest a = Forest [Tree a]
> instance Xy Forest Char where
> test (Forest (N a xs:txs)) = a
HTH,
- Andreas
--
Andreas Rossberg, rossberg@ps.uni-sb.de
:: be declarative. be functional. just be. ::