On Wed, Oct 18, 2006 at 09:48:31AM +0100, Simon Peyton-Jones wrote: > | I would think the easiest way to go about this would be to extend the > | rules pragma. > | > | {-# RULES "shift/const-inline" forall x y# . shift x y# = ... #-} > | > | where variables ending in # will only match constants known at compile time > > Interesting idea. GHC can do that *internally* using a "BuiltinRule", and > it's internal precisely because there's no obvious way to say "match only a > literal". > > I suppose that you might also want to say "match only a constructor"? To > have a rule for 'f' that would fire only when you saw > f (Just x) > or f Nothing > but not f (g y) > > For that, a # would not really be appropriate. > > > Would this be valuable? If so, think of a nice syntax. It's not trivial to > implement, but not hard either.
heh. thinking of a nice syntax is what has kept me from exposing this behavior to the user in jhc so far. :) I am thinking something like the following: {-# RULES "shift/const-inline" forall x y | is_constant y . shift x y = ... #-} which uses '|' like in pattern matching, where it specifies a condition the variable has to meet. so 'is_constant' will say whether y is completely known at compile time. the nice thing about this syntax is that it is extendable pretty easily {-# RULES "foo/known" forall x y | is_whnf y . foo x y = ... #-} where is_whnf will test whether y is bound directly to a constructor or a lambda expression. John -- John Meacham - ⑆repetae.net⑆john⑈ _______________________________________________ Glasgow-haskell-users mailing list Glasgow-haskell-users@haskell.org http://www.haskell.org/mailman/listinfo/glasgow-haskell-users