[Haskell-cafe] Question, re: failed attempt at constraining a Traversable instance.
capn.freako at gmail.com
Mon Feb 1 13:28:31 UTC 2016
I’m trying to do this:
data Tree a = Empty | Leaf a | Node (Tree a) a (Tree a)
instance Functor Tree where
fmap g Empty = Empty
fmap g (Leaf x) = Leaf (g x)
fmap g (Node t1 x t2) = Node (fmap g t1) (g x) (fmap g t2)
instance Foldable Tree where
foldMap f Empty = mempty
foldMap f (Leaf x) = f x
foldMap f (Node l k r) = foldMap f l `mappend` f k `mappend` foldMap f r
instance (Monoid (f (Tree a))) => Traversable (Tree (f a)) where
sequenceA Empty = pure Empty
sequenceA (Leaf f) = Leaf <$> f
sequenceA (Node t1 f t2) = (sequenceA t1) `mappend` (Leaf <$> f) `mappend` (sequenceA t2)
And I’m being told this:
The first argument of ‘Traversable’ should have kind ‘* -> *’, but ‘Tree (f a)’ has kind ‘*’
In the instance declaration for ‘Traversable (Tree (f a))’
And I don’t quite understand what I’m asking for that’s forbidden.
Is it that I’m trying to declare that only a certain subset of Trees are Traversable, and that’s not okay? It’s got to be all Trees or no Trees are Traversable?
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the Haskell-Cafe