gpt4 book ai didi

scala - 为什么 List 是一个半群而 Seq 不是?

转载 作者:行者123 更新时间:2023-12-03 10:59:46 25 4
gpt4 key购买 nike

我对 scalaz 还很陌生,我想弄清楚为什么下面的代码有效:

import scalaz._
import Scalaz._
scala> Map[String,List[String]]() |+| Map[String,List[String]]()
res3: scala.collection.immutable.Map[String,List[String]] = Map()

但这不...
import scalaz._
import Scalaz._
scala> Map[String,Seq[String]]() |+| Map[String,Seq[String]]()
<console>:14: error: value |+| is not a member of scala.collection.immutable.Map[String,Seq[String]]
Map[String,Seq[String]]() |+| Map[String,Seq[String]]()

我看到了半组隐含的 Map,但我没有看到 List 或 Seq 的映射。

几个问题:
  • ListSemigroup 的隐含在哪里?
  • 为什么 Seq 没有​​?
  • 最佳答案

    所以,在 Scalaz 7 中有一个 implicit List to Monoid function这会给你一个 Monoid[List[A]] . Monoid扩展 SemiGroup所以我们有 List 覆盖。
    Seq没有得到这种特殊待遇。没有来自 Seq 的隐式转换至 MonoidSemigroup .有一个implicit IndexedSeq to Monoid ,但这对我们没有帮助。

    为什么 Seq 没有​​?我不知道。也许 Seq 违反了幺半群/半群的一些定律,所以没有转换。 Scalaz 6 中的 Seq 似乎存在问题,因此他们删除了一些功能:
    https://groups.google.com/forum/?fromgroups=#!searchin/scalaz/Seq/scalaz/Deaec1H11W4/gYFSquXjTzYJ

    更新

    看看 scala doc,为什么 scalaz 人会走这条路变得更加明显。 List继承 LinearSeq 继承 Seq。 IndexedSeq继承 Seq.如果他们要为 Seq 提供一个半群,它可以覆盖 IndexedSeq 或 LinearSeq 上的任何其他半群,并在两者之间失去性能优势。如果您查看 append 的 scalaz 签名,您会发现它们利用了这些性能差异:

    https://github.com/scalaz/scalaz/blob/scalaz-seven/core/src/main/scala/scalaz/std/List.scala

      implicit def listMonoid[A]: Monoid[List[A]] = new Monoid[List[A]] {
    def append(f1: List[A], f2: => List[A]) = f1 ::: f2
    def zero: List[A] = Nil
    }

    https://github.com/scalaz/scalaz/blob/scalaz-seven/core/src/main/scala/scalaz/std/IndexedSeq.scala
    implicit def ixSqMonoid[A]: Monoid[IxSq[A]] = new Monoid[IxSq[A]] {
    def append(f1: IxSq[A], f2: => IxSq[A]) = f1 ++ f2
    def zero: IxSq[A] = empty
    }

    如果我们深入挖掘,我们会看到 Seq 只实现了 ++在列表上的性能比 ::: 差用于追加操作。所以,回答你的第二个问题,性能。如果 scalaz 为 Seq 实现了半群,则很可能会导致性能不明确,因为您只能针对索引进行优化。 Iterable 也有同样的问题。

    关于scala - 为什么 List 是一个半群而 Seq 不是?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15623585/

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