purescript-lists icon indicating copy to clipboard operation
purescript-lists copied to clipboard

Law-abiding `Apply NonEmptyList` that agrees with `Apply List`

Open UnrelatedString opened this issue 7 months ago • 1 comments

Description of the change

Rewrote the faulty

instance applyNonEmptyList :: Apply NonEmptyList where
  apply (NonEmptyList (f :| fs)) (NonEmptyList (a :| as)) =
    NonEmptyList (f a :| (fs <*> a : Nil) <> ((f : fs) <*> as))

to

instance applyNonEmptyList :: Apply NonEmptyList where
  apply (NonEmptyList (f :| fs)) (NonEmptyList (a :| as)) =
    NonEmptyList (f a :| map f as <> apply fs (a : as))

and likewise for the lazy equivalent.

A cleaner redo of my earlier PR #221.


Checklist:

  • [x] Added the change to the changelog's "Unreleased" section with a reference to this PR (e.g. "- Made a change (#0000)")
  • [ ] Linked any existing issues or proposals that this pull request should close
  • [ ] Updated or added relevant documentation
  • [x] Added a test for the contribution (if applicable)

UnrelatedString avatar May 02 '25 15:05 UnrelatedString

To clarify: the existing instance violates the law (<<<) <$> f <*> g <*> h = f <*> (g <*> h) and produces outputs in a different order than Apply Array.

UnrelatedString avatar May 28 '25 19:05 UnrelatedString