[GHC] #9545: Evaluate Takano Akio's foldrW/buildW fusion framework as a possible replacement for foldr/build
GHC
ghc-devs at haskell.org
Sat Sep 20 03:03:01 UTC 2014
#9545: Evaluate Takano Akio's foldrW/buildW fusion framework as a possible
replacement for foldr/build
-------------------------------------+-------------------------------------
Reporter: dfeuer | Owner:
Type: task | Status: closed
Priority: normal | Milestone:
Component: | Version: 7.9
libraries/base | Keywords:
Resolution: wontfix | Architecture: Unknown/Multiple
Operating System: | Difficulty: Project (more
Unknown/Multiple | than a week)
Type of failure: | Blocked By:
None/Unknown | Related Tickets:
Test Case: |
Blocking: |
Differential Revisions: |
-------------------------------------+-------------------------------------
Comment (by quantheory):
I don't think that I have enough information to resolve this, but I've
noticed some things that may help clarify the situation, for any onlookers
or future developers who haven't already figured them out. Apologies if
any of this is too obvious.
1) The `wrap`, `unwrap`, `cons`, and `nil` definitions have to be examined
in combination to check correctness. All are, in effect, defined by the
consumer.
I think that it's a bit confusing to have a `Wrap` type that only contains
`wrap`/`unwrap` when (aside from the trivial `wrap . unwrap = id` case)
the four have to be examined together to be understood. I'm agnostic as to
whether that should be addressed by replacing `Wrap` with a new type that
contains all four, or if `wrap`/`unwrap` pairs are so closely linked that
it justifies pairing them separately. Aside from `isoSimple`, I'm not sure
if many `Wrap` definitions would be reusable for very many consumers.
2) Producers are relatively constrained due to the use of `forall` in
`buildW` and `Wrap`. Since consumers choose the definition of
`wrap`/`unwrap`/`cons`/`nil` they are much freer. In an ideal (but
unproven) case, all producers using buildW would be good, given sufficient
constraints on of consumers.
3) These rules seem to me to be ''sufficient'' to ensure that a consumer
is correct (disregarding the treatment of _|_):
{{{
wrap . unwrap $ cons = cons
wrap . unwrap $ (\ _ _ -> nil) = \ _ _ -> nil
}}}
I've started to sketch a proof of this, but to be frank I'm rather new to
this sort of analysis and not at all confident. I'd be perfectly happy
either to discuss this, or for someone else to beat me there, or give a
counterexample. (I'm also not sure that `unwrap . wrap = id` is important,
though probably pairs with this property are easier to understand.)
4) I have much less confidence that my conditions in (3) are necessary
than that they are sufficient. They hold for `isoSimple` and the `foldl`
implementation by Takano Akio, but I have not quite wrapped my head
around, for instance, the scanl implementation here:
https://github.com/dolio/ww-fusion
This seems to get to the vague neighborhood of the condition on cons in
(3), but not quite there, which suggests that either that condition needs
to be expanded, or else that this implementation fails for some use of
scanl that I haven't tested.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/9545#comment:5>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list