IT

Scala에서 "컨텍스트 바인딩"이란 무엇입니까?

lottoking 2020. 8. 9. 09:14
반응형

Scala에서 "컨텍스트 바인딩"이란 무엇입니까?


Scala 2.8의 새로운 기능 중 하나는 경계 경계입니다. 여기에 바운드 란 무엇이며 어디에 유용합니까?

먼저 검색을 물론 했지만 ( 예를 들어 이를 찾았 지만) 정말 명확하고 자세한 정보를 찾을 수 없었습니다 .


이 기사 를 찾았 습니까? 배열 개선의 맥락에서 새로운 바인딩 기능을 다룹니다.

일반적으로 동적 바인딩있는 형식 매개 변수 는 형식입니다 [T: Bound]. 유형 T의 암시 적 매개 변수 와 함께 일반 유형 매개 변수로 확장 Bound[T]됩니다.

tabulate0에서 주어진 길이까지의 숫자 범위에 주어진 함수 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

반응형