2013-03-25 57 views
22

我是相當新的scalaz,我想弄清楚,爲什麼下面的代碼工作:爲什麼列出一個半羣但Seq不是?

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

我看到了地圖隱含的半羣,但我沒有看到List或Seq的那個。

夫婦的問題:

  1. 哪裏隱含的ListSemigroup?
  2. 爲什麼seq沒有一個?
+0

你使用的是什麼版本?您的標籤顯示,您正在詢問scalaz-7,而連接到Semigroup.scala的鏈接會導向master,即6.x. – folone

+0

我的確在使用7.我會修復我的鏈接。 – coltfred

回答

27

因此,在斯卡拉7有一個implicit List to Monoid function它給你回。 Monoid延伸SemiGroup所以我們列出了列表。

Seq沒有得到這種特殊待遇。沒有從SeqMonoidSemigroup的隱式轉換。有一個implicit IndexedSeq to Monoid,但這並不能幫助我們。

爲什麼seq沒有一個?我不知道。也許Seq違反了單音/半羣的一些規律,所以沒有轉換。好像有與SEQ問題Scalaz 6所以他們已經刪除了一些功能: https://groups.google.com/forum/?fromgroups=#!searchin/scalaz/Seq/scalaz/Deaec1H11W4/gYFSquXjTzYJ

UPDATE

望着斯卡拉文檔變得更加明顯,爲什麼人們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實現了半羣,那麼很可能會導致性能不明確,因爲您只能針對索引進行優化。 Iterable有同樣的問題。

+0

有關列表的位置問題的很好答案。似乎所有的迭代應該至少是半羣... – coltfred

+0

如果你看看scala doc,Seq是LinearSeq和IndexedSeq的基礎,它們都有不同的性能差異。 List繼承了LinearSeq,所以我可以看到他們爲什麼必須選擇List和IndexedSeq而不是Seq。我會看看我是否可以更簡潔地更新它。 – Noah

+0

這很有道理,謝謝! – coltfred

相關問題