Scala에서 "컨텍스트 바인딩"이란 무엇입니까?
Scala 2.8의 새로운 기능 중 하나는 경계 경계입니다. 여기에 바운드 란 무엇이며 어디에 유용합니까?
먼저 검색을 물론 했지만 ( 예를 들어 이를 찾았 지만) 정말 명확하고 자세한 정보를 찾을 수 없었습니다 .
이 기사 를 찾았 습니까? 배열 개선의 맥락에서 새로운 바인딩 기능을 다룹니다.
일반적으로 동적 바인딩 이 있는 형식 매개 변수 는 형식입니다 [T: Bound]
. 유형 T
의 암시 적 매개 변수 와 함께 일반 유형 매개 변수로 확장 Bound[T]
됩니다.
tabulate
0에서 주어진 길이까지의 숫자 범위에 주어진 함수 f를 적용한 결과로부터 배열을 형성하는 방법 을 고려하십시오 . Scala 2.7 테이블 형식은 다음과 같이 사용할 수 있습니다.
def tabulate[T](len: Int, f: Int => T) = {
val xs = new Array[T](len)
for (i <- 0 until len) xs(i) = f(i)
xs
}
Scala 2.8에서는 작동 정보가 올바른 표현을 생성하는 데 필요하기 때문에 더 이상 불가능합니다 Array[T]
. ClassManifest[T]
암시 적 매개 변수로 메소드 에를 전달 하여이 정보를 제공해야합니다 .
def tabulate[T](len: Int, f: Int => T)(implicit m: ClassManifest[T]) = {
val xs = new Array[T](len)
for (i <- 0 until len) xs(i) = f(i)
xs
}
속기 형식으로 대기열 바인딩 은 T
대신 형식 변수에 사용할 수 있습니다 .
def tabulate[T: ClassManifest](len: Int, f: Int => T) = {
val xs = new Array[T](len)
for (i <- 0 until len) xs(i) = f(i)
xs
}
Robert의 답변은 Context Bounds의 세부 사항을 다룹니다. 그 의미에 대한 제 해석을 드릴게요.
Scala에서 View Bound ( A <% B
)는 'can be seen as' <:
의 개념을 구조합니다 ( 상한 은 'is a'의 개념을 공중 함). 바인딩 바인딩 ( A : C
)은 유형에 대해 'has a'라고 말합니다. " T
에는 Manifest
" 로 매니페스트에 대한 예제를 읽을 수 있습니다 . 약 Ordered
에 대 -link 한 예 Ordering
는 차이점을 보여줍니다. 방법
def example[T <% Ordered[T]](param: T)
매개 변수가 Ordered
. 비교
def example[T : Ordering](param: T)
매개 변수에 Ordering
.
사용하는 데 시간이 걸리지 만 설정하는 데 시간이 걸리지 만 설정하는 경계가 뷰 경계보다 선호됩니다 (이제 뷰 경계는 더 이상 사용되지 않음 발생 ). 한 가지 제안은 직접 참조 할 필요없이 암시 사용 적 정의를 한 범위에서 다른 범위로 전송해야 할 때 바인딩이 선호하는 것입니다 (확실히 ClassManifest
배열을 만드는 데있는 경우 입니다 ).
뷰 경계와 비슷한 경계에 대해 생각하는 또 다른 방법은 첫 번째가 호출자의 범위에서 암시 적 변환을 전송한다는 것입니다. 두 번째는 호출자의 범위에서 암시 적 개체를 전송합니다.
(이것은 괄호 안의 메모입니다. 먼저 다른 해독을 이해하십시오.)
경계 경계는 실제로 뷰 경계를 일반화합니다.
따라서이 코드는 View Bound로 표현됩니다.
scala> implicit def int2str(i: Int): String = i.toString
int2str: (i: Int)String
scala> def f1[T <% String](t: T) = 0
f1: [T](t: T)(implicit evidence$1: (T) => String)Int
또한 유형에서 이것은 유형 F
으로의 함수를 나타내는 유형 별칭의 도움으로 컨텍스트로 표현 될 수 있습니다 바인딩 T
.
scala> trait To[T] { type From[F] = F => T }
defined trait To
scala> def f2[T : To[String]#From](t: T) = 0
f2: [T](t: T)(implicit evidence$1: (T) => java.lang.String)Int
scala> f2(1)
res1: Int = 0
많은 바인딩은 유형 생성자와 함께합니다 * => *
. 그러나 유형 생성자 Function1
는 종류 (*, *) => *
입니다. 유형을 사용하면 두 번째 유형 변수를 유형과 함께 부분적으로 적용 String
하여 사용할 바인딩으로 사용할 올바른 유형의 유형을 생성합니다.
트레이 트 내에서 사용하는 경우 사용하지 않고 Scala에서 사용하지 않고 직접 표현할 수 있습니다. 그런 다음 다음과 같이 자리 수 있습니다.
def f3[T : [X](X => String)](t: T) = 0
이 또 다른 괄호 안의 메모입니다.
로 벤 지적 , 바인딩 컨텍스트는 형식 매개 변수 및 유형 클래스 사이에 "이-는"제약 조건을 나타냅니다. 즉, 특정 유형 클래스의 암시 적 값이 존재한다는 제약 조건을 나타냅니다.
컨텍스트 바운드를 사용할 때 종종 암시 적 값을 표면화해야합니다. 예를 들어 제약 조건이 주어지면 제약 조건 을 충족하는 T : Ordering
인스턴스가 종종 필요합니다 Ordering[T]
. 여기 에 설명 된대로implicitly
메서드 또는 약간 더 유용한 context
메서드 를 사용하여 암시 적 값에 액세스 할 수 있습니다 .
def **[T : Numeric](xs: Iterable[T], ys: Iterable[T]) =
xs zip ys map { t => implicitly[Numeric[T]].times(t._1, t._2) }
또는
def **[T : Numeric](xs: Iterable[T], ys: Iterable[T]) =
xs zip ys map { t => context[T]().times(t._1, t._2) }
참고 URL : https://stackoverflow.com/questions/2982276/what-is-a-context-bound-in-scala
'IT' 카테고리의 다른 글
NavigationView에 바닥 글을 추가하는 방법 -Android 지원 디자인 라이브러리? (0) | 2020.08.09 |
---|---|
사용자 메시지의 복수 (0) | 2020.08.09 |
한 번에 모든 테이블 복구 (0) | 2020.08.09 |
ios9에서 stringByAddingPercentEscapesUsingEncoding을 대체할까요? (0) | 2020.08.09 |
사람이 읽을 수있는 방식으로 Java .class 파일을 열려면 어떻게해야합니까? (0) | 2020.08.09 |