programing

척도 연결, ::: vs ++

javamemo 2023. 5. 10. 20:11
반응형

척도 연결, ::: vs ++

사이에 차이가 있습니까?:::그리고.++스칼라의 목록을 연결하기 위해?

scala> List(1,2,3) ++ List(4,5)
res0: List[Int] = List(1, 2, 3, 4, 5)

scala> List(1,2,3) ::: List(4,5)
res1: List[Int] = List(1, 2, 3, 4, 5)

scala> res0 == res1
res2: Boolean = true

문서를 보면 다음과 같습니다.++반면에 더 일반적입니다.:::이라List-특정의후자는 다른 기능 언어에서 사용되기 때문에 제공됩니까?

Legacy. 목록은 원래 기능 언어 모양으로 정의되었습니다.

1 :: 2 :: Nil // a list
list1 ::: list2  // concatenation of two lists

list match {
  case head :: tail => "non-empty"
  case Nil          => "empty"
}

물론, 스칼라는 다른 컬렉션들을 특별한 방식으로 진화시켰습니다.2.8이 출시되었을 때 코드 재사용을 극대화하고 일관된 API를 사용할 수 있도록 컬렉션을 재설계했습니다.++두 컬렉션을 연결합니다. 심지어 반복자도 연결합니다.그러나 목록은 사용되지 않는 한두 개의 연산자를 제외하고 원래 연산자를 유지해야 했습니다.

항상 사용:::효율성과 유형 안전성의 두 가지 이유가 있습니다.

효율성.

x ::: y ::: z보다 빠름x ++ y ++ z,왜냐면:::올바른 연상입니다. x ::: y ::: z로 해석됩니다.x ::: (y ::: z)알고리즘적으로 더 빠릅니다.(x ::: y) ::: z(후자는 O(|x|) 단계가 더 필요합니다.)

형식 안전성

와 함께:::두 개만 연결할 수 있습니다.List포함++모든 컬렉션을 에 추가할 수 있습니다.List끔찍한 일입니다.

scala> List(1, 2, 3) ++ "ab"
res0: List[AnyVal] = List(1, 2, 3, a, b)

++또한 사용하기 쉽습니다.+:

scala> List(1, 2, 3) + "ab"
res1: String = List(1, 2, 3)ab

:::목록에서만 작동하는 반면++모든 통과 가능한 항목과 함께 사용할 수 있습니다.현재 구현(2.9.0)에서,++에 의지하여:::그 주장도 마찬가지라면List.

다른 점은 첫 번째 문장이 다음과 같이 구문 분석된다는 것입니다.

scala> List(1,2,3).++(List(4,5))
res0: List[Int] = List(1, 2, 3, 4, 5)

두 번째 예는 다음과 같이 구문 분석됩니다.

scala> List(4,5).:::(List(1,2,3))
res1: List[Int] = List(1, 2, 3, 4, 5)

따라서 매크로를 사용하는 경우에는 주의해야 합니다.

게다가.++두 목록이 호출됩니다.:::그러나 목록에서 목록으로 작성자를 포함하는 암묵적인 값을 요청하기 때문에 오버헤드가 더 많습니다.하지만 마이크로벤치마크는 그런 면에서 유용한 것으로 증명되지 않았습니다. 컴파일러가 그러한 호출을 최적화한다고 생각합니다.

워밍업 후 마이크로벤치마크가 표시됩니다.

scala>def time(a: => Unit): Long = { val t = System.currentTimeMillis; a; System.currentTimeMillis - t}
scala>def average(a: () => Long) = (for(i<-1 to 100) yield a()).sum/100

scala>average (() => time { (List[Int]() /: (1 to 1000)) { case (l, e) => l ++ List(e) } })
res1: Long = 46
scala>average (() => time { (List[Int]() /: (1 to 1000)) { case (l, e) => l ::: List(e ) } })
res2: Long = 46

다니엘 씨로서.Sobrai는 다음을 사용하여 수집 내용을 목록에 추가할 수 있다고 말했습니다.++반면에:::목록만 연결할 수 있습니다.

언급URL : https://stackoverflow.com/questions/6559996/scala-list-concatenation-vs

반응형