Hmm.  Your example relies on inlining 'arr' at its call site.
My guess is that you aren't using -O.  In that case, there's no
cross-module inlining, so 'arr' doesn't get inlined.  

Is that it?

Simon

> -----Original Message-----
> From: Kevin Atkinson 
> Sent: Tuesday, June 29, 1999 4:44 AM
> To: [EMAIL PROTECTED]
> Subject: Rule question.
> 
> 
> I was playing around with rules and I got some unexpected results.  By
> just moving some stuff into a separate module I got different results.
> 
> Could some one explain to me while this program:
> 
> module Main where
> 
>   data Arr ix el = Arr Int [(ix,el)] deriving Show
> 
>   replaceMany :: [(ix,el)] -> Arr ix el -> Arr ix el
>   replaceMany = error "In Replace Many"
> 
>   {-# RULES 
>      "rule1" forall f,l,a. replaceMany (map f l) a = 
> replaceManyMap f l
> a 
>    #-}
> 
>   replaceManyMap :: (v -> (ix,el)) -> [(ix,el)] -> Arr ix el -> Arr ix
> el
>   replaceManyMap = error "In Replace Many Map"
> 
>   arr s l =
>       let a = Arr s [] in
>       replaceMany l a
> 
>   arr2 s l = 
>       arr s (map (\(i,e)->(i+2,e)) l)
> 
>   main = print$ arr2 10 [(1::Int,10::Int),(2,20)]
> 
> produces "Fail: In Replace Many Map" as expected but:
> 
> module Main where
> 
>   import T2
> 
>   arr2 s l = 
>       arr s (map (\(i,e)->(i+2,e)) l)
> 
>   main = print$ arr2 10 [(1::Int,10::Int),(2,20)]
> 
> module T2 where
> 
>   data Arr ix el = Arr Int [(ix,el)] deriving Show
> 
>   replaceMany :: [(ix,el)] -> Arr ix el -> Arr ix el
>   replaceMany = error "In Replace Many"
> 
>   {-# RULES 
>      "rule1" forall f,l,a. replaceMany (map f l) a = 
> replaceManyMap f l
> a 
>    #-}
> 
>   replaceManyMap :: (v -> (ix,el)) -> [(ix,el)] -> Arr ix el -> Arr ix
> el
>   replaceManyMap = error "In Replace Many Map"
> 
>   arr s l =
>       let a = Arr s [] in
>       replaceMany l a
> 
> produces "Fail: In Replace Many"?
> 
> And how to fix the problem.
> 
> Thanks in advance.
> 
> -- 
> Kevin Atkinson
> [EMAIL PROTECTED]
> http://metalab.unc.edu/kevina/
> 

Reply via email to