Yhc.Core Proposal: Split out CoreLit's from CoreExpr, Add CoreAlt

Hi, Following in roughly the same vein as the libraries submission process, here is a submission to change Yhc.Core. Currently we have CoreInt, CoreInteger, CoreFloat, CoreDouble etc, all as members of CoreExpr. For alternatives in a case expression we have just any expression as the left hand side. I propose: data CoreExpr = .... | CoreLit CoreLit data CoreLit = CoreInt Int | CoreInteger Integer | CoreFloat Float The benefits of this change are minimal, but I think it cleans things up a bit. Next we can go from: CoreCase CoreExpr [(CoreExpr,CoreExpr)] to: data CoreAlt = AltCon CoreConName [CoreVarName] | AltLit CoreLit | AltDefault CoreCase CoreExpr [(CoreAlt,CoreExpr)] The advantages of this are many. Currently when matching "[]", it is possible to end up with CoreApp (CoreCon "[]") [], or CoreCon "[]", both of which mean the same thing. Additionally, lots of code looks like: let (CoreCon a,b) = fromCoreApp lhs vs = map fromCoreVar b The fromCoreVar here would crash if any of b's were not variables, something which is not guaranteed by the type system. As a reference point, GHC uses something more similar to what is being proposed. The original reason for allow any arbitrary expression was to permit desugaring of pattern matches after converting to Core, but that doesn't appear possible because of lazy/strict pattern matching, pattern matching in let/where etc. As such there is no benefit to arbitrary patterns in these positions. Any comments or thoughts on these things? Thanks Neil
participants (1)
-
Neil Mitchell