
You're not looking at the latest version of the code. I'm guessing you're looking at the stable version instead of the HEAD.
Indeed, I'm looking at the source distribution for 6.10.3, since that's the reference version I use to test the files.
ctypedoc :: { LHsType RdrName } : 'forall' tv_bndrs '.' ctypedoc { LL $ mkExplicitHsForAllTy $2 (noLoc []) $4 } | context '=>' ctypedoc { LL $ mkImplicitHsForAllTy $1 $3 } -- A type of form (context => type) is an *implicit* HsForAllTy | ipvar '::' type { LL (HsPredTy (HsIParam (unLoc $1) $3)) } | typedoc { $1 }
This should accept both
multipleCtx :: (Eq a => Show a => a) multipleCtx = undefined
and
multipleCtx :: Eq a => Show a => a multipleCtx = undefined
The reason why ctypedoc and ctype were so different before, is because they drifted apart after ctypedoc was added. ctype was changed (I think during implementation of the TypeFamilies extension) without any changes to ctypedoc. This was fixed in HEAD not so long ago.
Thanks a lot for the information, then I know. So the correct thing to do is to put a ctype in the recursive position after the context. I sorely wish these things were better documented... Cheers, /Niklas