복붙노트

[SCALA] 왜 목록 반군하지만 서열은 그렇지?

SCALA

왜 목록 반군하지만 서열은 그렇지?

나는 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. ==============================

    1.그래서, Scalaz 7 [A] [목록] 다시 모노 이드 당신을 제공 모노 이드 기능을 암시 목록이있다. 우리는 목록이 덮여 그래서 모노 이드는 반군을 확장합니다.

    그래서, Scalaz 7 [A] [목록] 다시 모노 이드 당신을 제공 모노 이드 기능을 암시 목록이있다. 우리는 목록이 덮여 그래서 모노 이드는 반군을 확장합니다.

    서열이 특별 대우를하지 않습니다. 모노 이드 또는 반군에 서열로부터 암시 적 변환이 없습니다. 이 모노 이드에 대한 암시 IndexedSeq이다, 그러나 이것은 우리에게 도움이되지 않습니다.

    왜이 서열에 대한 것이 아니다? 모르겠어요. 아무런 변환이 없다, 그래서 아마도 서열은 monoids / 반군의 몇 가지 법칙을 위반하는 것입니다. 그들이 일부 기능을 제거했습니다 있도록 Scalaz 6 서열에 문제가 있었다 것 같다 : https://groups.google.com/forum/?fromgroups=#!searchin/scalaz/Seq/scalaz/Deaec1H11W4/gYFSquXjTzYJ

    최신 정보

    scalaz의 사람들이이 길을 갔다 왜 스칼라 문서를 보면 그것은 더욱 분명해진다. 서열을 상속 목록 상속의 LinearSeq. IndexedSeq 서열을 상속합니다. 그들은 서열에 대한 반군을 제공한다면, 그것은 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
      }
    

    우리가 깊이 파고 경우에, 우리는 볼이 APPEND 작업보다 ::: 목록에 나쁜 성능을 가지고 서열만을 구현 ++. 따라서, 성능을 두 번째 질문에 대답합니다. scalaz 서열에 대한 반군 구현하면 색인을 위해 당신은 최적화 할 수 모호한 성능이 가장 가능성이 리드를 것입니다 것처럼. 반복 가능한 같은 문제가 있습니다.

  2. from https://stackoverflow.com/questions/15623585/why-is-list-a-semigroup-but-seq-is-not by cc-by-sa and MIT license