2013-03-25 6 views
22

मैं काफी 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]]() 

मैं मानचित्र के लिए अंतर्निहित देखना सेमिग्रुप, लेकिन मुझे सूची या सीक के लिए कोई नहीं दिख रहा है।

युगल सवाल:

  1. कहाँ ListSemigroup के लिए निहित है?
  2. सेक के लिए क्यों नहीं है?
+0

आप किस संस्करण का उपयोग कर रहे हैं? आपके टैग सुझाव देते हैं, आप स्कालाज़-सात के बारे में पूछ रहे हैं, जबकि Semigroup.scala का लिंक मास्टर की ओर जाता है, जो 6.x है। – folone

+0

मैं वास्तव में 7 का उपयोग कर रहा हूं। मैं अपना लिंक ठीक कर दूंगा। – coltfred

उत्तर

27

तो, स्केलज़ 7 में implicit List to Monoid function है जो आपको Monoid[List[A]] वापस देता है। MonoidSemiGroup बढ़ाता है इसलिए हमारे पास सूची शामिल है।

Seq यह विशेष उपचार नहीं मिलता है। Seq से Monoid या Semigroup से कोई अंतर्निहित रूपांतरण नहीं है। implicit IndexedSeq to Monoid है, लेकिन यह हमारी सहायता नहीं करता है।

सेक के लिए क्यों नहीं है? मुझे नहीं पता। शायद सेक मोनोइड्स/सेमिग्रुप के कुछ कानूनों का उल्लंघन करता है इसलिए कोई रूपांतरण नहीं होता है। ऐसा लगता है कि वहाँ Seq के साथ मुद्दों Scalaz 6 में थे तो वे कुछ सुविधाओं को निकाल दिया है: https://groups.google.com/forum/?fromgroups=#!searchin/scalaz/Seq/scalaz/Deaec1H11W4/gYFSquXjTzYJ

अद्यतन

स्केला दस्तावेज़ को देखते हुए क्यों scalaz लोगों इस तरह से चला गया इसे और अधिक स्पष्ट हो जाता है। List लीनारसेक को विरासत में मिला जो सीक को विरासत में मिला। IndexedSeq सीक विरासत में मिला। यदि वे सेक के लिए एक सेमिग्रुप प्रदान करना चाहते थे, तो यह इंडेक्सडैक या लाइनरसेक पर किसी भी अन्य सेमिग्रुप को ओवरराइड कर सकता था और दोनों के बीच प्रदर्शन प्रदर्शन को कम करता था। आप संलग्न के लिए 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 केवल ++ लागू करता है जो परिचालन परिचालन के लिए ::: से सूचियों पर खराब प्रदर्शन करता है। तो, अपने दूसरे प्रश्न, प्रदर्शन का जवाब देने के लिए। यदि स्कालज़ ने सेक के लिए सेमिग्रुप लागू किया है तो यह संभवतः संदिग्ध प्रदर्शन की ओर ले जाएगा क्योंकि आप केवल अनुक्रमित के लिए अनुकूलित करने में सक्षम होंगे। Iterable एक ही मुद्दा है।

+0

इस बारे में सवाल का जवाब है कि कोई सूची के लिए कहां है। ऐसा लगता है कि सभी पुनरावृत्तियों कम से कम semigroups होना चाहिए ... – coltfred

+0

यदि आप स्कैला दस्तावेज़ देखते हैं, तो सीईसी लीनियरसेक और इंडेक्सडैक के लिए आधार है, जिसमें दोनों के अलग-अलग प्रदर्शन अंतर होते हैं। सूची लीनियरसेक विरासत में है, इसलिए मैं देख सकता हूं कि उन्हें सीईसी के बजाय सूची और इंडेक्सडैक चुनना क्यों था। मैं देखूंगा कि मैं इसे और अधिक संक्षेप में अपडेट कर सकता हूं या नहीं। – Noah

+0

यह बहुत अच्छी समझ में आता है, धन्यवाद! – coltfred

संबंधित मुद्दे