gpt4 book ai didi

Scala map2 over tuple with inner monoid (or : how to do this simple thing but better? )

转载 作者:行者123 更新时间:2023-12-01 09:55:59 25 4
gpt4 key购买 nike

情况:

事件流 (RxScala),我们使用 tumblingBuffer() 对其进行批处理,然后构建完整的调试历史记录。最终我想要这些在 (Seq[T], Seq[T]) 中的所有值,所以我创建了以下函数作为 foldLeft 的累加器:

def tupleConcat[S](a: (Seq[S], Seq[S]), b: (Seq[S], Seq[S])) = (a._1 ++ b._1, a._2 ++ b._2)

现在,在阅读了 Runar 和 Paul 的《Scala 中的函数式编程》之后,这对我来说引起了一系列警钟,因为这看起来非常像两个 monoid 实例的 map2,但我仍然对如何适本地概括它。到目前为止,我认为它可能看起来像:

def tupleConcatSG[S](a: (S,S), b: (S,S))(implicit s: Semigroup[S]) = (a._1 |+| b._1, a._2 |+| b._2)

(但我必须从我能收集到的信息中将我的 Seq 提升为 IndexedSeq)。

为了进一步推广到任何 Applicative,我想我需要一个元组实例,它可能来自 Shapeless?还是我错过了一些明显的东西?

编辑:我还应该补充一点,基于有偏见的性能问题,我正在尝试避免压缩和解压缩,但也许我不应该为此担心......(每个 tumblingBuffer 的 (Seq,Seq) 值(value)将约为 15,000很长,最后的 (Seq,Seq) 应该以百万为单位)。

最佳答案

元组部分已经存在;在最坏的情况下,您将需要 shapeless-scalaz。您的 tupleConcatSG 很好(您可以使用 : Semigroup 糖而不是显式隐式),但如果您希望能够使用 |+| 你需要让它成为一个 Semigroup 实例,并且隐式可用:

implicit def tupleConcatSg[S: Semigroup] = new Semigroup[(S, S)] {
def append(f1: (S, S), f2: (S, S)) = ...
}

我怀疑你真正的问题是 scalaz 没有为 Seq 提供任何实例,只为 IndexedSeq - 参见 Why is List a Semigroup but Seq is not? .但是如果您不担心使用 Seq++ 的性能影响,您可以很容易地编写自己的 Monoid[Seq]List 上:

implicit object SeqMonoid extends Monoid[Seq]{...}

我不确定您所说的进一步泛化到任何 Applicative 是什么意思——我们已经很泛化了。如果您正在谈论为 Applicative 的组合获取 Applicative 实例,例如 List[Writer[Vector[String], A]],那应该自动发生。

关于Scala map2 over tuple with inner monoid (or : how to do this simple thing but better? ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27492588/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com