척도 연결, ::: 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
'programing' 카테고리의 다른 글
기존 SQL Server 로그인을 동일한 이름의 기존 SQL Server 데이터베이스 사용자에 연결하는 방법 (0) | 2023.05.10 |
---|---|
값을 기준으로 데이터 그리드 셀 색상 변경 (0) | 2023.05.10 |
ASP를 사용하여 세션에 액세스합니다.NET 웹 API (0) | 2023.05.10 |
ASP에서 이메일을 보내는 방법.NET C# (0) | 2023.05.10 |
이 인증서에는 잘못된 발급자 Apple Push Services가 있습니다. (0) | 2023.05.10 |