Re: DeriveFoldable treatment of tuples is surprising

On Wed Mar 22 13:54:05 UTC 2017, Twan van Laarhoven wrote:
On 2017-03-21 21:34, David Feuer wrote: This seems much too weird:
*> :set -XDeriveFoldable *> data Foo a = Foo ((a,a),a) deriving Foldable *> length ((1,1),1) 1 *> length $ Foo ((1,1),1) 3
Hmm. *> length $ Just ((1, 1), 1) 1 *> length $ Just (1, 1) 1 *> length (1, 1) 1
This is not unique to tuples, consider:
> :set -XDeriveFoldable > data Foo a = Foo [[a]] deriving Foldable > length [[1,2]] 1 > length $ Foo [[1,2]] 2
> length $ Just [[1, 2]] 1 Does the behaviour of other methods within Foldable seem surprising for DeriveFoldable Foo a = Foo ((a, a), a)? Did the FTP change touch DeriveFoldable? (Silly question, yes it must have: `length` didn't used to be in Foldable.)
On Tue Mar 21 21:29:20 UTC 2017, Edward Kmett wrote: In general I think the current behavior is the least surprising as it "walks all the a's it can" and is the only definition compatible with further extension with Traversable. Right now there are no instances provided by base that violate the "walk all the a's" intuition
?? Are there instances in base where the `a` appears more than once on RHS? I can see only List and Array. How would I have formed that "walk all the a's" intuition? (For most of the Prelude instances, `length`s result is hard-coded as 0 or 1.) *> length (((1, 2), 3) :: Num a => ((a, a), a)) 1 Doesn't seem to "walk all the a's" there. I find pretty much all of these results surprising. (Admittedly for different reasons in different cases.) I think this is a good reason `length` should not be in Foldable. "lengthiness" just doesn't fit the abstraction. AntC
participants (1)
-
Anthony Clayden