col*_*red 24 functional-programming scala scalaz scalaz7
我是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.
情侣问题:
Noa*_*oah 29
因此,在Scalaz 7中有一个隐含List的   Monoid函数,它可以让你回归Monoid[List[A]].Monoid扩展SemiGroup所以我们有List.
Seq没有得到这种特殊待遇.没有隐含的转换Seq为Monoid或Semigroup.有一个隐含IndexedSeq的Monoid,但这对我们没有帮助.
为什么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也有同样的问题.
| 归档时间: | 
 | 
| 查看次数: | 1679 次 | 
| 最近记录: |