Scala 使用case类的折叠和空实例从List[IO(抽象[List[A]]]]移动到IO[Abstraction[List[A]]]]

Scala 使用case类的折叠和空实例从List[IO(抽象[List[A]]]]移动到IO[Abstraction[List[A]]]],scala,fold,case-class,monoids,semigroup,Scala,Fold,Case Class,Monoids,Semigroup,首先,我有一个case类定义为(这是库的一部分): 我想将它用作fold的主要组件,以便从List[IO[Abstraction[List[a]]]]转到IO[Abstraction[List[a]]] 当我读到这篇文章时,我想把它作为Monoid的一个实例来定义合并最终结果的行为 我的建议如下,但我知道它有错误,因为我没有很好地理解它 implicit val instanceabstaction : Monoid[Abstraction[A]] = new Monoid[Abstractio

首先,我有一个case类定义为(这是库的一部分):

我想将它用作fold的主要组件,以便从List[IO[Abstraction[List[a]]]]转到IO[Abstraction[List[a]]]

当我读到这篇文章时,我想把它作为Monoid的一个实例来定义合并最终结果的行为

我的建议如下,但我知道它有错误,因为我没有很好地理解它

implicit val instanceabstaction : Monoid[Abstraction[A]] = new Monoid[Abstraction[A]] = {

    def empty: Abstraction[A] = Abstraction(Either.empty[AbError, A] , 0 , Map.empty[String, String])
    def combine(x: Abstraction[A], y: Abstraction[A]): Int = x ++ y
  }

如果有任何其他方法可以实现这一点,我愿意接受命题,正如我在您前面的问题(,copy:)中已经回答的那样,只有您知道如何组合类的实例。这取决于您的业务逻辑。思考如何组合
抽象(either1,status1,map1)
抽象(either2,status2,map2)
。这将通过在其中任何一个中合并正确的值来实现,因为stats和map对它们来说都是相同的。使用monoid实例是一种好方法吗?我会在外部使用NonEmptyList。然后,我会使用
nonemptrysequence
将NonEmptyList[IO[a]]转换为IO[NonEmptyList[a]]然后您可以使用
combineAll
仅使用半群折叠非空列表,如果抽象是一个幺半群,我将使用类似
input.sequence.map(u.reduce)
的东西,它还使用遍历和Applicative(针对列表和IO存在)。
implicit val instanceabstaction : Monoid[Abstraction[A]] = new Monoid[Abstraction[A]] = {

    def empty: Abstraction[A] = Abstraction(Either.empty[AbError, A] , 0 , Map.empty[String, String])
    def combine(x: Abstraction[A], y: Abstraction[A]): Int = x ++ y
  }