복붙노트

[SCALA] 스칼라에서 "바인딩 컨텍스트"는 무엇입니까?

SCALA

스칼라에서 "바인딩 컨텍스트"는 무엇입니까?

스칼라 2.8의 새로운 기능 중 하나는 상황에 맞는 범위입니다. 어떤 컨텍스트 바인딩하고 어디 유용?

물론 내가 먼저 검색 (예를 이것에 대한 발견)하지만 난 어떤 정말 명확하고 자세한 정보를 찾을 수 없습니다.

해결법

  1. ==============================

    1.이 문서를 찾으셨습니까? 그것은 배열 개선의 컨텍스트 내에서, 새로운 컨텍스트 바인딩 기능을 포함한다.

    이 문서를 찾으셨습니까? 그것은 배열 개선의 컨텍스트 내에서, 새로운 컨텍스트 바인딩 기능을 포함한다.

    일반적으로, 결합 된 콘텍스트 타입 파라미터의 형식이다 [의 T : 바운드]; 이는 [T] 바운드 형 내재적 매개 변수와 함께 일반 타입 파라미터 T까지 확장된다.

    적용의 결과로부터 어레이를 형성하는 방법을 고려 표로 주어진 길이까지 0에서 숫자 범위에 주어진 함수 f. 스칼라 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
    }
    

    런타임 정보는 어레이의 우측 표현 [T]를 생성 할 필요가 있기 때문에 스칼라 2.8이 더 이상 가능하지 않다. 하나는 암시 파라미터로서 상기 방법으로 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
    }
    
  2. ==============================

    2.로버트의 대답은 문맥 경계의 기술적 인 세부 사항을 설명합니다. 나는 당신에게 그 의미의 나의 해석을 줄 것이다.

    로버트의 대답은 문맥 경계의 기술적 인 세부 사항을 설명합니다. 나는 당신에게 그 의미의 나의 해석을 줄 것이다.

    (: 개념을 포착 'A는'<상한이있는 반면) 스칼라 (A

    def example[T <% Ordered[T]](param: T)
    

    주문한대로 매개 변수를 볼 수 있다고 말한다. 와 비교

    def example[T : Ordering](param: T)
    

    이는 매개 변수가 관련 주문을 가지고 있다고 말한다.

    규칙을 설정할 수하는 사용의 관점에서, 그것은 잠시 걸렸지 만 컨텍스트 경계는 (뷰 경계는 이제 사용되지 않습니다)보기 경계 선호한다. 한 가지 제안 (이 확실히 ClassManifest 배열을 만드는 데 사용에 대한 경우이다) 결합 된 콘텍스트는 직접 참조하지 않고 다른 한 범위를 암시 정의를 전송해야 할 때 바람직하다이다.

    뷰 범위와 상황에 맞는 범위에 대해 생각하는 또 다른 방법이다 호출자의 범위에서 첫 번째 전송 암시 적 변환이. 두 번째 전송 발신자의 범위에서 내장 객체.

  3. ==============================

    3.(이 괄호 노트입니다. 읽고 먼저 다른 답변을 이해합니다.)

    (이 괄호 노트입니다. 읽고 먼저 다른 답변을 이해합니다.)

    컨텍스트 경계 실제로보기 경계를 일반화.

    그래서, 바운드 볼 수있는 표현이 코드를 부여 :

    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
    

    이것은 또한 T.를 입력 타입 F의 기능을 나타내는 타입 별칭의 도움으로, 바인딩 컨텍스트로 표현 될 수있다

    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
    

    바인딩 컨텍스트는 * => * 가지 타입 생성자와 함께 사용되어야한다. 타입 생성자 기능 1 종류의 인 단 (*, *) => *. 타입 별칭의 사용은 부분적으로 결합 된 컨텍스트로서 사용하기위한 올바른 가지 타입 생성자를 수득 형식 문자열을 제 2 타입 파라미터를 적용한다.

    당신이 직접 특성 내부의 유형 별칭을 사용하지 않고, 스칼라에서 부분적으로 적용 유형을 표현할 수 있도록하는 제안이있다. 그런 다음 쓸 수 있습니다 :

    def f3[T : [X](X => String)](t: T) = 0 
    
  4. ==============================

    4.이것은 또 다른 괄호 노트입니다.

    이것은 또 다른 괄호 노트입니다.

    벤이 지적한 바와 같이, 바인딩 컨텍스트는 형식 매개 변수 및 유형 클래스 사이에 "이-는"제약 조건을 나타냅니다. 다른 방법을 넣어, 그것은 특정 유형 클래스의 암시 적 값이 존재하는 제약 조건을 나타냅니다.

    바인딩 컨텍스트를 사용하는 경우, 하나는 종종 암시 값을 표면 필요가있다. 예를 들어, 제약 T를 주어진 : 주문, 하나는 제약 조건을 만족 [T]를 주문의 인스턴스를 필요가 종종 있습니다. 여기에서 알 수 있듯이, 그것은 암시 적 방법 또는 약간 더 도움이 상황에 맞는 방법을 사용하여 암시 적 값에 액세스하는 것이 가능하다 :

    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) }
    
  5. from https://stackoverflow.com/questions/2982276/what-is-a-context-bound-in-scala by cc-by-sa and MIT license