簡體   English   中英

為什么List是Semigroup而Seq不是?

[英]Why is List a Semigroup but Seq is not?

我是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]]()

我看到Semigroup隱含了Map,但我看不到List或Seq的Map。

情侶問題:

  1. ListSemigroup隱含在哪里?
  2. 為什么Seq不存在?

因此,在Scalaz 7中有一個隱含的List to Monoid函數 ,它會返回一個Monoid[List[A]] Monoid擴展了SemiGroup因此我們覆蓋了List。

Seq沒有得到這種特殊待遇。 有從沒有隱式轉換Seq ,以MonoidSemigroup Monoid有一個隱含的IndexedSeq ,但這對我們沒有幫助。

為什么Seq不存在? 我不知道。 也許Seq違反了一些幺半群/半群的定律,所以沒有轉換。 看起來Scalaz 6中的Seq存在問題,因此他們刪除了一些功能: https ://groups.google.com/forum/?fromgroups =#!searchin / skipa / Seq / scalaz / Deaec1H11W4 /gYFSquXjTzYJ

UPDATE

看看scala doc,scalaz人們為什么會這樣變得更加明顯。 List繼承繼承Seq的LinearSeq。 IndexedSeq繼承Seq。 如果它們為Seq提供半群,它可以覆蓋IndexedSeq或LinearSeq上的任何其他半群,並且兩者之間的性能優勢松散。 如果您查看附加的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實現了semigroup,那么很可能會導致模糊的性能,因為你只能為索引進行優化。 Iterable也有同樣的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM