[SCALA] 스칼라 문맥 볼 경계는 무엇인가?
SCALA스칼라 문맥 볼 경계는 무엇인가?
간단한 방법으로, 컨텍스트 및 뷰 경계는 무엇과 그들 사이의 차이점은 무엇입니까?
일부 쉽게 따라 할 수있는 예는 너무 좋은 것!
해결법
-
==============================
1.그래서, 질문은 "관련"줄에 식별 할 수없는 경우, 나는이 이미 질문을 받았다 생각하지만. 그래서, 여기있다 :
그래서, 질문은 "관련"줄에 식별 할 수없는 경우, 나는이 이미 질문을 받았다 생각하지만. 그래서, 여기있다 :
바인딩보기는 일반적인 구문이 일부 유형 B. 것처럼 어떤 타입 A의 사용을 가능하게 스칼라 도입기구였다
def f[A <% B](a: A) = a.bMethod
즉, 하나의 유형 A의 객체 표준 라이브러리에서보기 경계의 가장 일반적인 사용에 B의 메소드를 호출 할 수 있도록, 가능한 B로 암시 적 변환을해야한다 (스칼라 2.8.0, 어쨌든 전)이다 와 같이, 순서가 :
def f[A <% Ordered[A]](a: A, b: A) = if (a < b) a else b
하나로 변환 할 수 있기 때문에 순서 지정 [A] 및 정렬 때문에 [A]의 방법 <정의 (기타 : A) : 부울, I는 식에게
당신이 그들을 피해야한다,보기 경계가 사용되지 않습니다 양해하여 주시기 바랍니다.
컨텍스트 경계는 스칼라 2.8.0에 도입되었으며, 일반적으로 소위 Class 형 패턴, 비록 더 자세한 방법으로, 하스켈 타입 클래스에서 제공하는 기능을 에뮬레이트 코드의 패턴으로 사용됩니다.
결합 된 뷰가 단순 유형으로 이용 될 수 있지만 (예를 들어, <% 문자열), 결합 된 정렬 컨텍스트와 같은 파라미터 화 된 형태를 요구한다 [A] 상기 있지만 문자열 달리.
바인딩 컨텍스트 대신보기 바인딩의 암시 적 변환의 내재적 가치를 설명합니다. 이것은 어떤 유형 A의 것을 선언하는 데 사용 가능한 타입 B의 내재적 값 [A]가있다. 구문은 다음과 같이 간다 :
def f[A : B](a: A) = g(a) // where g requires an implicit value of type B[A]
이 그것을 사용하는 방법을 즉시 명확하지 않기 때문에 뷰가 결합 된 것보다 더 혼란 스럽다. 스칼라의 사용의 일반적인 예는 이것이다 :
def f[A : ClassManifest](n: Int) = new Array[A](n)
파라미터 화 된 형태의 배열 초기화와 관련된 비밀의 이유는 삭제하고 배열의 비 삭제 자연을 입력 할 수있는 가능한이 될 수있는 ClassManifest이 필요합니다.
도서관의 또 다른 매우 일반적인 예는 좀 더 복잡하다 :
def f[A : Ordering](a: A, b: A) = implicitly[Ordering[A]].compare(a, b)
(: A B : A A) 지능 여기 내재적 클래스에있어서, 비교를 정의 형 주문 [A], 하나, 우리가 원하는 암시 값을 검색하기 위해 사용된다.
우리는 아래에이 일을 다른 방법을 볼 수 있습니다.
보기 경계 및 상황에 맞는 범위가 모두 자신의 정의를 주어, 암시 적 매개 변수를 사용하여 구현되는 놀라운 일이 안된다. 사실, 내가 보여 구문은 정말 무슨 일에 대한 문법 설탕입니다. 그들이 어떻게 해제 설탕 아래를 참조하십시오 :
def f[A <% B](a: A) = a.bMethod def f[A](a: A)(implicit ev: A => B) = a.bMethod def g[A : B](a: A) = h(a) def g[A](a: A)(implicit ev: B[A]) = h(a)
그래서, 자연, 하나는 상황에 맞는 범위에 특별히 유용하다 자신의 전체 구문, 그들을 쓸 수 있습니다 :
def f[A](a: A, b: A)(implicit ord: Ordering[A]) = ord.compare(a, b)
보기 경계 하나는 어떻게 든 원래의 형식을 반환 할 상황에서, 기존 클래스에 메소드를 "추가"이를 통해 포주 내 라이브러리에 패턴을 활용하기 위해 주로 사용된다. 당신이 어떤 방법으로 그 유형을 돌려 줄 필요가없는 경우에, 당신은 바인드 뷰를 필요로하지 않습니다.
보기 바운드 사용의 전형적인 예는 순서가 처리하는. 암시 적 변환이 비록 지능은 예를 들어, 정렬되지 않는다. 이 비 변환 유형을 반환하기 때문에 이전에 주어진 예는 바인딩 된 뷰를 필요 :
def f[A <% Ordered[A]](a: A, b: A): A = if (a < b) a else b
이 예는보기 경계없이 작동하지 않습니다. 나는 다른 형식을 반환한다면 그러나, 나는 더 이상 바인드 뷰를 필요로하지 않습니다
def f[A](a: Ordered[A], b: A): Boolean = a < b
나는 F에 매개 변수를 전달하기 전에 그것에 대해 알 필요가 없다 F 그래서 여기 변환 (필요한 경우) 발생합니다.
주문한 게다가 그들은 스칼라 컬렉션 것처럼, 라이브러리의 가장 일반적인 사용은, Java 클래스입니다 문자열 및 배열을 처리한다. 예를 들면 :
def f[CC <% Traversable[_]](a: CC, b: CC): CC = if (a.size < b.size) a else b
하나의 뷰 경계없이이 작업을 수행하려고하면, 문자열의 반환 유형은 WrappedString (스칼라 2.8), 그리고 유사하게 배열에 대한 것입니다.
종류는 반환 형식의 형식 매개 변수로 사용되는 경우에도 같은 일이 발생합니다
def f[A <% Ordered[A]](xs: A*): Seq[A] = xs.toSeq.sorted
컨텍스트 경계는 주로 하스켈의 타입 클래스에 대한 참조로, typeclass 패턴으로 알려지게되었다 무엇에 사용됩니다. 기본적으로,이 패턴은 암시 어댑터 패턴의 종류를 통해 제공 기능을함으로써 상속에 대한 대안을 구현합니다.
고전적인 예는 스칼라 라이브러리 전반에 걸쳐 발주 한 바뀌 스칼라 2.8의 주문이다. 사용법은 :
def f[A : Ordering](a: A, b: A) = if (implicitly[Ordering[A]].lt(a, b)) a else b
당신은 일반적으로 다음과 같이 기록 된 것을 볼 수 있지만 :
def f[A](a: A, b: A)(implicit ord: Ordering[A]) = { import ord.mkOrderingOps if (a < b) a else b }
어떤 전통적인 운영자 스타일을 가능하게 주문 내부의 암시 적 변환을 활용. 스칼라 2.8의 또 다른 예는 숫자입니다 :
def f[A : Numeric](a: A, b: A) = implicitly[Numeric[A]].plus(a, b)
더 복잡한 예는 CanBuildFrom의 새로운 컬렉션 사용량이지만, 거기에 대한 매우 긴 대답은 이미, 그래서 내가 여기를 피할 수 있습니다. 그리고, 앞서 언급 한 바와 같이, 콘크리트 종류없이 새로운 배열을 초기화하는 데 필요한 ClassManifest 사용량이있다.
뷰 경계가 좋은 디자인하여 자신의 코드에 방지 할 수있는 반면 typeclass 패턴으로 바인딩 컨텍스트는 (다른 사람의 디자인을 해결하기 위해 주로 사용된다, 그들은 문제의 분리를 가능으로, 자신의 클래스에서 사용하기에 훨씬 더 가능성이 높습니다 ).
그것은 오랜 시간 동안 가능했습니다 있지만, 상황에 맞는 경계의 사용은 정말 2010 년 이륙, 지금 스칼라의 가장 중요한 라이브러리와 프레임 워크의 대부분에서 어느 정도 발견된다. 그것의 사용의 가장 극단적 인 예를 들어,하지만, 스칼라 하스켈의 힘을 많이 가져 오는 Scalaz 라이브러리입니다. 나는 그것을 사용할 수있는 더 알게 그것을 모든 방법을 얻을 수 typeclass 패턴에 최대 읽어 보시기 바랍니다.
편집하다
관심의 관련 질문 :
from https://stackoverflow.com/questions/4465948/what-are-scala-context-and-view-bounds by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 무엇`을 수행합니다 _ *`(콜론 스타 밑줄) 스칼라합니까? (0) | 2019.10.28 |
---|---|
[SCALA] 작업하지 직렬화 : java.io.NotSerializableException 클래스 만하지 개체에 대한 폐쇄 외부 함수를 호출 할 때 (0) | 2019.10.28 |
[SCALA] 스칼라 2.8 브레이크 아웃 (0) | 2019.10.28 |
[SCALA] 어떻게 스파크 DataFrames를 사용하여 JSON 데이터 열을 쿼리합니다? (0) | 2019.10.28 |
[SCALA] 어떻게 데이터 집합에서 사용자 정의 개체를 저장하는 방법? (0) | 2019.10.28 |