
On Wed, Sep 29, 2010 at 9:13 PM, Alexander Solla
On 09/29/2010 02:15 PM, DavidA wrote:
instance Monad (\v -> Vect k (Monomial v))
Yes, that is exactly what I am trying to say. And since I'm not allowed to say it like that, I was trying to say it using a type synonym parameterised over v instead.
Why not:
instance Monad ((->) Vect k (Monomial v))
No, what he's trying to say is
instance Monad (Vect k . Monomial)
with some type-level composition for . which would give these signatures:
return :: forall a. a -> Vect k (Monomial a) (>>=) :: forall a b. Vect k (Monomial a) -> (a -> Vect k (Monomial b)) -> Vect k (Monomial b)
Notice that the "forall" variables are inside parentheses in the type; this is what Haskell doesn't allow. Of course you can
newtype VectMonomial k a = VM { unVM :: Vect k (Monomial a) } instance Monad (VectMonomial k) where ...
But now you need to wrap/unwrap using VM/unVM. -- ryan