On 5/20/06, Bas van Dijk <[EMAIL PROTECTED]> wrote:
How can I make this work?

As far as I know, you can't. To see the problem, rewrite it using dictionaries:

data Simplify a = Simplify { simplify :: a -> a }

simplify_HsExp (HsInfixApp e1 op e2) = HsApp (HsApp (opToExp op) e1) e2
simplify_HsExp (HsLeftSection  e  op)= HsApp (opToExp op) e
simplify_HsExp (HsRightSection op e) = HsApp (opToExp op) e
simplify_HsExp (HsParen e) = e
simplify_HsExp e = e

Simplify_HsExp = Simplify simplify_HsExp

etc.

You will end up with a bunch of Simplify_* objects. Now in the application:

preProcess = everywhere (mkT simplify)

how do you convert this? If you use (mkT (simplify ...)), you're
fixing simplify to only one type. If you use (mkT simplify), you get a
type error.

GHC is telling you that you need to tell it which instance of simplify
to use. In your example, you can use:

everywhere (mkT (simplify :: HsExp -> HsExp))
. everywhere (mkT (simplify :: HsPat -> HsPat))
. everywhere (mkT (simplify :: HsRhs -> HsRhs))

Of course, that's not any simpler.

--
Taral <[EMAIL PROTECTED]>
"You can't prove anything."
   -- Gödel's Incompetence Theorem
_______________________________________________
Haskell mailing list
Haskell@haskell.org
http://www.haskell.org/mailman/listinfo/haskell

Reply via email to