[Haskell-cafe] rank-2 :(

Ross Paterson ross at soi.city.ac.uk
Tue Jan 10 18:38:42 EST 2006


On Tue, Jan 10, 2006 at 08:47:32PM +0300, Bulat Ziganshin wrote:
> those rank-2 types wil make me mad :)
> 
> encodeHelper :: (MRef m r, Binary m a, BitStream m (StringBuffer m r))
>              => a -> m String
> encodeHelper x = do h <- newStringBuffer "" stringBufferDefaultCloseFunc
>                     put_ h x
>                     getStringBuffer h
> encode x = runST (encodeHelper x)
> 
> i can't force `encode` to compile, either with or without any type
> signatures. actually, signature for `encodeHelper` was developed by
> Hugs, but now i don't know how to proceed further
> 
> just now tried to force Hugs tell me its type. mission impossible :)
> 
> DataAltBinaryClass> :t (runST (encodeHelper 1))
> ERROR - Cannot justify constraints in application
> *** Expression    : encodeHelper 1
> *** Type          : ST c [Char]
> *** Given context : ()
> *** Constraints   : (Num b, Binary (ST c) b)

It's telling you that your expression is ill-typed, and that

	encodeHelper 1 :: (Num b, Binary (ST s) b) => ST s String

runST is declared with an argument type in which s is unconstrained,
so this is rejected.

> Binary class in my library includes monad in its header. May be it's
> the cause of problems?
> 
> class Binary m a where
>     -- | Convert value to sequence of bits and write it to the stream
>     put_   :: (BitStream m h) => h -> a -> m ()

Yes, that's the problem.



More information about the Haskell-Cafe mailing list