So I was playing around with Data.Set.Monad, which does not seem to be an instance of Data.Foldable like Data.Set is. I decided to try and add this instance myself as an experiment:
import Data.Foldable (Foldable, foldr)
import qualified Data.Set.Monad as S (Set, foldr)
instance Foldable S.Set where
foldr = S.foldr
I get compilation error:
No instance for (Ord a) arising from a use of ‘S.foldr’
Possible fix:
add (Ord a) to the context of
the type signature for foldr :: (a -> b -> b) -> b -> Set a -> b
In the expression: S.foldr
In an equation for ‘foldr’: foldr = S.foldr
In the instance declaration for ‘Foldable Set’
Okay, this must be because S.foldr :: Ord a => (a -> b -> b) -> b -> Set a -> b
. How do I express this constraint in the instance declaration? I tried this:
instance (Ord a) => Foldable (Set a) where
foldr = S.foldr
And get another compilation error:
The first argument of ‘Foldable’ should have kind ‘* -> *’,
but ‘Set a’ has kind ‘*’
In the instance declaration for ‘Foldable (Set a)’
What am I doing wrong? Or will Haskell even let me create this instance at all?
So, you need to define Foldable Set
. Which means you can't depend on a
, since foldr
is required to work for any a
.
So basically you would need constraint kinds to be embedded into the definition of Foldable
to make this work, I think.
Note that Data.Set.foldr
doesn't have the Ord a
constraint so it can define a Foldable
instance.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With