[GHC] #9495: Do What I Mean RULES for foldr2 look shady

GHC ghc-devs at haskell.org
Sun Aug 24 07:47:15 UTC 2014


#9495: Do What I Mean RULES for foldr2 look shady
-------------------------------------+-------------------------------------
              Reporter:  dfeuer      |            Owner:
                  Type:  bug         |           Status:  new
              Priority:  highest     |        Milestone:  7.8.4
             Component:              |          Version:  7.8.3
  libraries/base                     |         Keywords:
            Resolution:              |     Architecture:  Unknown/Multiple
      Operating System:              |       Difficulty:  Unknown
  Unknown/Multiple                   |       Blocked By:
       Type of failure:  Runtime     |  Related Tickets:
  crash                              |
             Test Case:              |
              Blocking:              |
Differential Revisions:              |
-------------------------------------+-------------------------------------

Comment (by dfeuer):

 Replying to [comment:3 nomeata]:
 > So while I dislike the slight asymmetry here, I don’t think it is
 justified to not follow the standard here.

 We ''already'' aren't following the standard here! These are the three
 options I see (tl;dr: I think options 1 and 3 deserve serious
 consideration, and option 4 less; option 2 is more a Haskell Prime kind of
 question):

 1. Eliminate `foldr1/right`, which will bring us into compliance with the
 standard, and change the documentation to indicate that we only fuse on
 the left list. The confluence problem is eliminated. The only downside is
 that if someone is relying on this rule, then their code will slow down.
 They will be able to fix this easily, but only if they pay attention to
 GHC release notes, are still maintaining their code, etc.

 2. Change the baseline (not rewritten) definition of `foldr2` to check for
 nil on the second list first, and then eliminate `foldr1/left`. Document a
 violation of the standard. This also eliminates the confluence problem. I
 think it's arguably friendlier to fuse on the ''last'' argument than the
 first. That said, I don't think this is really a sensible option at this
 point because it has the downsides of most of the other options combined.

 3. Change the baseline (not rewritten) definition of `foldr2` to force the
 second list to WHNF if the first is nil, rendering `foldr2` symmetrical.
 Document a violation of the standard. This approach ensures (I
 ''believe'') that the (still non-confluent) rules cannot produce bottoms
 that weren't there before. Personally, I would consider this the most
 conservative acceptable approach.

 4. Leave things as they are in the code, but explain the situation in the
 documentation. I don't like this option, for the simple reason that code
 that runs correctly with `-O0` and doesn't do anything weird with funky
 `GHC.*.*` or `unsafe*` functions really should also run correctly with
 `-O`, but currently that is not the case.

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/9495#comment:4>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list