On Thu, 02 Oct 2003 14:57:22 +0200, Juanma Barranquero <[EMAIL PROTECTED]> wrote:
> data Accum s a = Ac [s] a > > instance Monad (Accum s) where > return x = Ac [] x > Ac s1 x >>= f = let Ac s2 y = f x in Ac (s1++s2) y > > output :: a -> Accum a () > output x = Ac [x] () After trying this one, and also output :: a -> Accum a a output x = Ac [x] x I though of doing: data Accum a = Ac [a] a because I was going to accumulate a's into the list. That didn't work; defining >>= gave an error about the inferred type being less polymorphic than expected ('a' and 'b' unified, etc.). After thinking a while, I sort of understood that >>= is really more polymorphic, i.e., even if it is constraining [s] to be a list (because it is using ++), it really is saying nothing about the contents of the list. It is "output" who's doing the constraint, but, with the very same monad, I could do: output :: [a] -> Accum Int [a] output x = Ac [length x] x or output :: a -> Accum [a] a output x = Ac [[x]] x or whatever. But then I wondered, is there any way to really define data Accum a = Ac [a] a i.e., constraining it to use a for both values, and make a monad from it? Curious, Juanma _______________________________________________ Haskell-Cafe mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell-cafe