
So if I want to use Monad, I have to have Reverse only work with Strings and not some data type that might be a String? Is there a workaround that would allow me to preserve flexibility around the target datatype? Otherwise I'll rename Forward and Reverse to toString and fromString, but the notion of being able to guarantee a roundtrip in and out of an arbitrary datatype seems useful and powerful. -Alex- On Tue, 23 Mar 2004, Jon Fairbairn wrote:
On 2004-03-23 at 16:58EST "S. Alexander Jacobson" wrote:
Implementing Reverse from before, I am running into this weird error:
type ReverseType a string = (string ->(string,a)) data Reverse a string = Reverse (ReverseType a string)
instance Monad (Reverse a s) where return x = Reverse (\text -> (text,x)) (Reverse p) >>= k = Reverse p3 where p3 s0 = p2 s1 where (Reverse p2) = k a (s1,a)=p s0
Produces the error:
Kind error: Expecting kind `* -> *', but `Reverse a s' has kind `*' When checking kinds in `Monad (Reverse a s)' In the instance declaration for `Monad (Reverse a s)'
I have no clue what this error message means.
Kinds are to types what types are to values. You've declared Reverse to have two arguments: it takes a type, then another type and returns a type, so its kind is * -> * -> *. (Reverse a) has kind * -> * and (Reverse a s) has kind *.
Now a monad is something that takes a type as an argument, so has kind * -> *, for example IO has kind * -> * -- you expect to see IO Something most places. So (Reverse a) could perhaps be a monad, but (Reverse a s) cannot be.
-- Jón Fairbairn Jon.Fairbairn@cl.cam.ac.uk
_________________________________________________________________ S. Alexander Jacobson mailto:me@alexjacobson.com tel:917-770-6565 http://alexjacobson.com