
I wrote a little wrapper around ghc to see how what parameters were used: ghc --make -odir "C:\prive\eclipseworkspace\ADL trunk\out" -hidir "C:\prive\eclipseworkspace\ADL trunk\out" -o "C:\prive\eclipseworkspace\ADL trunk\bin\ADL" -dcore-lint Main.hs So this is only some paths and -dcore-lint. I remember trying that after I had ran into the bug. I used your hints and this is what happend. I did not use eclipsefp, but compiled directly from the command line. Also, inbetwean builds I deleted all intermediate files, just to make sure that everything was built with the same options. a1) First I compiled everything (with the original alternative 1) again with ghc --make -odir "C:\prive\eclipseworkspace\ADL trunk\out" -hidir "C:\prive\eclipseworkspace\ADL trunk\out" -o "C:\prive\eclipseworkspace\ADL trunk\bin\ADL" -dcore-lint -O Main.hs Then I ran the executable. It didn't mention a stack overflow, but it said: ADL.exe: <<loop>> after which it stoped. a2) Now I put the original alternative 2 in place, and compiled everything from scratch : ghc --make -odir "C:\prive\eclipseworkspace\ADL trunk\out" -hidir "C:\prive\eclipseworkspace\ADL trunk\out" -o "C:\prive\eclipseworkspace\ADL trunk\bin\ADL" -dcore-lint -O Main.hs Again I ran the executable, but it terminated as before, doing what I expected it to do. No stack overflow, no loop whatsoever. b) Now I tried the modified alternative 1: antecedent :: Rule -> Expression antecedent r = case r of Ru{} -> if (rrsrt r == AlwaysExpr) then error ("(Module ADLdataDef:) illegal call to antecedent of rule "++show r) else rrant r Sg{} -> antecedent (srsig r) Gc{} -> let x = grspe r in r `seq` Tm r Fr{} -> frcmp r Compiled again with: ghc --make -odir "C:\prive\eclipseworkspace\ADL trunk\out" -hidir "C:\prive\eclipseworkspace\ADL trunk\out" -o "C:\prive\eclipseworkspace\ADL trunk\bin\ADL" -dcore-lint -O Main.hs it said: ADLdataDef.hs:41:57: Couldn't match expected type `Morphism' against inferred type `Rule' In the first argument of `Tm', namely `r' In the second argument of `seq', namely `Tm r' In the expression: r `seq` Tm r I hardly use any let expressions (shame on me??) and I am not very familiar with them. But I figured out you might have mistaken, so I changed the bit to: antecedent :: Rule -> Expression antecedent r = case r of Ru{} -> if (rrsrt r == AlwaysExpr) then error ("(Module ADLdataDef:) illegal call to antecedent of rule "++show r) else rrant r Sg{} -> antecedent (srsig r) Gc{} -> let x = grspe r in r `seq` Tm x Fr{} -> frcmp r Compiled again with: ghc --make -odir "C:\prive\eclipseworkspace\ADL trunk\out" -hidir "C:\prive\eclipseworkspace\ADL trunk\out" -o "C:\prive\eclipseworkspace\ADL trunk\bin\ADL" -dcore-lint -O Main.hs Again, it sais ADL.exe: <<loop>> My conclusion is until now that I have here two variants of a piece of code that should be semantically equivalent. In the same context (the rest of the program hasn't changed) however, they behave different. Hence I suspect a bug in ghc... 8-(( Since my first posting of this thread, I have been searching around, and I have learnt that there are some pragma's that could be used. Are there any of them that I should have used when using this kind of pattern matching? I might have omitted them. Han Joosten. -- View this message in context: http://www.nabble.com/Differences-in-pattern-matching-syntax--tp21416338p214... Sent from the Haskell - Glasgow-haskell-users mailing list archive at Nabble.com.