I have naive questions on `rules'.
1.
In the program data D a = D a Bool
fromD1 (D a _) = a
may the rule forall x. fromD1 (D x _) = x
help the performance in the further program?
Instead, does the inlining (and simplifier?) do all the business?
2.
It may occur that GHC simplifies nn x = not (not x) :: Bool
to nn = id
- does it?
It may occur due to that Bool consists of only two values, and it is
easy to find not .not === id
Do it make sense {-# RULES ... forall x. tail (x:xs) = xs,
tail .(x:) = id, #-}
and the like?
3.
Has the compiler to simplify map not (map not xs) to id ?
It makes first map (\x-> not (not x)) xs
according to the standard "mapmap" `rule'.
Then, map (\x->x) xs, map id xs
- according to its "not-not" knowledge (or maybe, rule).
Then, could the compiler guess also of
map id xs === xs ?
It looks like some sort of inductive reasoning needed.
Or maybe, the standard rule for this.
Suppose we have this rule. If, for example, the user puts
{-# RULES "fg" forall x. f (g x) = x #-}
for some known to the user operators f,g,
then the rules would simplify map f (map g xs) === xs
automatically.
4.
Even without rules, has the compiler to simplify, say,
reverse [x,y,z] to [z,y,x] ?
Being applied recursively, `reverse' is not in-lined. But maybe, there
is an option in compiler for trying to compute each function partially
by applying number N of reductions at compile time?
( -fevaluatePartiallyToDepth<NN> :-) )
Thank you in advance for the comments.
------------------
Sergey Mechveliani
[EMAIL PROTECTED]