Skip to content

Unexpected behavior of NonEmptyList.reduce for tuples of lists #4817

Description

@kiendang

NonEmptyList.reduce used the wrong, or at least unexpected Semigroup instance for tuples of lists. I'm not sure if it's due to cats itself or the compiler though.


Let's say I want to semigroup combine a couple of tuples of lists

Tuple(List(1, 2)).combine(Tuple(List(5)))

I would get Tuple(List(1, 2, 5)), which is expected.

However if I do

NonEmptyList.of(Tuple(List(1, 2)), Tuple(List(5))).reduce

I would get Tuple(<function>). Looks like my tuples of lists not as tuples of List were inferred as tuples of (Int => Int) which is surprising. I would expect the same Semigroup instance would be used in both examples.

I even got

NonEmptyList.of((List(1, 2), List(1, 2), List(5, 6)), (List(4), List(5), List(7))).reduce

to produce Tuple(List(1, 2, 4),List(1, 2, 5),<function1>) on my local machine using scala-cli on Scala 3.7.4 but I couldn't reproduce elsewhere.

Weirder still, this workaround that looks like it would do nothing

def reduce[T: Semigroup](xs: NonEmptyList[T]) =
  xs.reduce

reduce(Tuple(List(1, 2)).combine(Tuple(List(5))))

produces Tuple(List(1, 2, 5)).

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions