Ha, well spotted!  GHC's "RULE" mechanism is specifically designed to allow 
library authors to add domain specific optimisations.  Just as a library author 
can write a buggy implementation of 'reverse', so s/he can write a buggy 
optimisation rule.

So I guess it's up to the authors and maintainers of Control.Arrow to decide 
whether they want to remove the rule, or simply advertise that instances of 
Arrow had better obey it!  In which case the libraries list is the place to 
discuss.

Simon

| -----Original Message-----
| From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Ryan
| Ingram
| Sent: 19 October 2007 07:01
| To: Simon Peyton-Jones
| Cc: haskell-cafe@haskell.org
| Subject: Re: [Haskell-cafe] Class invariants/laws
|
| Just today I was looking at the implementation of Arrows and noticed this:
|
| {-# RULES
| "compose/arr"   forall f g .
|                 arr f >>> arr g = arr (f >>> g)
| ... other rules ...
| #-}
|
| But consider this "Arrow":
| newtype (a :>> b) = LA2 { runLA2 :: [a] -> [b] }
|
| instance Arrow (:>>) where
|         arr = LA2 . map
|         LA2 ab >>> LA2 bc = LA2 $ \la ->
|                                 let dupe [] = []
|                                     dupe (x:xs) = (x : x : dupe xs)
|                                     lb = dupe (ab la)
|                                 in bc lb
|         first (LA2 f) = LA2 $ \l -> let (as,bs) = unzip l in zip (f as) bs
|
| runLA2 (arr (+1) >>> arr (+1)) [1,2,3]
| => [3,3,4,4,5,5]
|
| runLA2 (arr ((+1) >>> (+1))) [1,2,3]
| => [3,4,5]
|
| Now, the RULE clearly states one of the arrow laws, so it's sound for
| any real Arrow, and :>> is clearly not a real Arrow.  But, :>>
| satisfies the "compiles" restriction and breaks the validity of the
| RULE.
|
|   -- ryan
|
|
| On 10/18/07, Simon Peyton-Jones <[EMAIL PROTECTED]> wrote:
| > | > These invariants are basically impossible to enforce by the compiler,
| > | > but nonetheless certain classes have laws which are expected to hold,
| > | > and I would not be surprised if (for example) GHC optimization RULES
| > | > depended on them.
| > |
| > | I, in fact, would be surprised if there were such dependencies. (Not
| > | that there might not be good reasons to want to rely on such laws for
| > | some conceivable optimization, I just doubt that any implementation
| > | actually does.)
| > |
| > | Simon?
| >
| > I don't believe GHC relies on any class laws.  It'd be pretty dangerous to 
do so, I think.
| >
| > Simon
| >
| _______________________________________________
| Haskell-Cafe mailing list
| Haskell-Cafe@haskell.org
| http://www.haskell.org/mailman/listinfo/haskell-cafe
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to