복붙노트

[SCALA] <무엇을 할 : <, <% <및 = = 스칼라 2.8에 의미, 어디 그들은 문서화?

SCALA

<무엇을 할 : <, <% <및 = = 스칼라 2.8에 의미, 어디 그들은 문서화?

나는 그들이 =>으로 (에서) 일반적인 함수 타입의 서브 클래스입니다 PREDEF에 대한 API 문서에서 볼 수 있지만 그것이라고 전부입니다. 음, 뭐? 어쩌면이 문서는 곳이지만, 검색 엔진처럼 "이름을"처리하지 않는다 "<<"아주 잘, 그래서 그것을 찾을 수 없어.

후속 질문 : 나는이 펑키 기호 / 클래스를 사용하고, 왜해야합니까?

해결법

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

    1.이러한 일반화 된 유형의 제약 조건이라고합니다. 그들은 더는 형식 매개 변수 중 하나를 제한하기 위해, 형태 파라미터 클래스 또는 특성 내에서, 당신이 할 수 있습니다. 다음은 그 예이다 :

    이러한 일반화 된 유형의 제약 조건이라고합니다. 그들은 더는 형식 매개 변수 중 하나를 제한하기 위해, 형태 파라미터 클래스 또는 특성 내에서, 당신이 할 수 있습니다. 다음은 그 예이다 :

    case class Foo[A](a:A) { // 'A' can be substituted with any type
        // getStringLength can only be used if this is a Foo[String]
        def getStringLength(implicit evidence: A =:= String) = a.length
    }
    

    암시 적 인수 증거가 컴파일러에 의해 제공됩니다, IFF A는 문자열이다. 당신은이 문자열임을 증거로 생각할 수 - 인수 자체 만이 존재하는 것을 알고, 중요하지 않습니다. [편집 : 당신이 컴파일러는 당신 소리가 a.length 전화를하지 않을 수 있습니다 무엇 문자열 A에서 암시 적 변환을 나타 내기 때문에 아니라, 기술적 사실은 중요하다]

    지금은과 같이 사용할 수 있습니다 :

    scala> Foo("blah").getStringLength
    res6: Int = 4
    

    하지만 문자열 이외를 포함하는 푸와 함께 사용하려고하는 경우 :

    scala> Foo(123).getStringLength
    <console>:9: error: could not find implicit value for parameter evidence: =:=[Int,String]
    

    당신은 그 오류를 읽을 수있는 "증거를 찾을 수 없습니다 지능 == 문자열이"같은 ... 그것이 있어야로 그건! getStringLength는 일반적으로 푸 필요한 것보다 유형에 대한 추가 제한을 부과한다; 즉, 당신은 단지 푸 [문자열]에 getStringLength를 호출 할 수 있습니다. 이 제약은 멋진 컴파일 시간에 적용됩니다!

    <<과 <% <하지만 약간의 차이와 유사하게 작동합니다 :

    @retronym의이 조각은 일반화 된 형태의 제약 쉽게 지금을 어떻게 사용되는 이런 종류의 물건이 달성 될하는 방법의 좋은 설명입니다.

    추가

    당신의 후속 질문에 대답하기 위해, 일반적으로 인정 하듯이 내가 준 예는 매우 인위적인 분명 유용하지 않습니다. 그러나 정수의 목록을 추가하는 List.sumInts 방법 같은 것을 정의하는 데 사용하는 상상. 이 방법은 단지 목록 [지능], 오래된 목록에 호출 할 수 있도록 싶지 않아요. 그러나 목록 유형 생성자는 너무 constrainted 수 없습니다; 당신은 여전히 ​​문자열, FOOS, 바, whatnots의 목록을 가질 수 있어야합니다. 그래서 sumInts에 일반화 된 형태의 제약 조건을 배치하여, 당신은 단지 그 방법은 단지 목록 [지능]에 사용할 수있는 추가적인 제약 조건이 보장 할 수 있습니다. 기본적으로 당신은 목록의 특정 종류의 특별한 경우의 코드를 작성하고 있습니다.

  2. ==============================

    2.pelotom의 예에서, 예를 들어, 당신은 일반적으로 이러한 "사업자"를 사용하는 방법 : 아니 완전한 답변은 (다른 사람이 이미이 대답했다), 난 그냥 어쩌면 더 나은 구문을 이해하는 데 도움이 다음 사항을주의하고 싶었 :

    pelotom의 예에서, 예를 들어, 당신은 일반적으로 이러한 "사업자"를 사용하는 방법 : 아니 완전한 답변은 (다른 사람이 이미이 대답했다), 난 그냥 어쩌면 더 나은 구문을 이해하는 데 도움이 다음 사항을주의하고 싶었 :

    def getStringLength(implicit evidence: A =:= String)
    

    형 사업자 스칼라의 대안 중위 구문을 사용합니다.

    그래서, A = : = 문자열 =과 동일합니다 : = [문자열] (와 = = 그냥 클래스 또는 멋진 보이는 이름을 가진 특징 부 (trait)이다). 이 구문은 또한 당신이 쓸 수있는 예를 들어, "일반"클래스와 함께 작동합니다 :

    val a: Tuple2[Int, String] = (1, "one")
    

    이 같은 :

    val a: Int Tuple2 String = (1, "one")
    

    이 메서드 호출과 "정상적인"에 대한 두 개의 구문과 유사합니다. 및 () 및 조작 구.

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

    3.이러한 구조가 무엇인지 이해하기 위해 다른 답변을 읽어보십시오. 당신이 그들을 사용해야 할 때 여기입니다. 특정 유형으로 만 사용하는 방법을 제한 할 필요가있을 때 당신이 그들을 사용합니다.

    이러한 구조가 무엇인지 이해하기 위해 다른 답변을 읽어보십시오. 당신이 그들을 사용해야 할 때 여기입니다. 특정 유형으로 만 사용하는 방법을 제한 할 필요가있을 때 당신이 그들을 사용합니다.

    다음은 예이다. 이 같은 균일 한 쌍을 정의한다고 가정 :

    class Pair[T](val first: T, val second: T)
    

    지금 당신은이 같은 방법 작은 추가 할 :

    def smaller = if (first < second) first else second
    

    T 주문한 경우 만 작동합니다. 당신은 전체 클래스를 제한 할 수 있습니다 :

    class Pair[T <: Ordered[T]](val first: T, val second: T)
    

    하지만 그 수치를 보인다 - T는 주문하지 않는 경우 클래스의 사용이있을 수 있습니다. 형식 제약 조건으로, 당신은 여전히 ​​작은 방법을 정의 할 수 있습니다 :

    def smaller(implicit ev: T <:< Ordered[T]) = if (first < second) first else second
    

    그것은 한 당신이 그것을에 작은 호출하지 않는 한, 말, 페어 [파일]의 인스턴스를 확인합니다.

    옵션의 경우, 구현은 옵션 [지능]에 대한 이해가되지 않습니다 되었더라도 orNull 방법을 원했다. 유형의 제약 조건을 사용하여, 모두 잘 있습니다. 당신은 옵션 [문자열]에 orNull 사용할 수 있으며, 당신은 당신이 그것을 orNull를 호출하지 않는 한, 옵션 [지능]을 형성하고 사용할 수 있습니다. 당신이 일부 (42) .orNull를하려고하면, 당신은 매력적인 메시지가

     error: Cannot prove that Null <:< Int
    
  4. ==============================

    4.그것은 그들이 사용되는 위치에 따라 달라집니다. 암시 적 매개 변수의 유형을 선언하면서 사용하는 경우 대부분의 경우, 그들은 클래스입니다. 그들도 드문 경우의 객체가 될 수 있습니다. 마지막으로, 그들은 매니페스트 객체에 대한 운영자가 될 수 있습니다. 특히 문서화 아니지만 그들은 처음 두 경우에 scala.Predef 내부에 정의되어 있습니다.

    그것은 그들이 사용되는 위치에 따라 달라집니다. 암시 적 매개 변수의 유형을 선언하면서 사용하는 경우 대부분의 경우, 그들은 클래스입니다. 그들도 드문 경우의 객체가 될 수 있습니다. 마지막으로, 그들은 매니페스트 객체에 대한 운영자가 될 수 있습니다. 특히 문서화 아니지만 그들은 처음 두 경우에 scala.Predef 내부에 정의되어 있습니다.

    후자를 사용할 수없는 경우 상황에서 수행하고 <% : 그들은 정당한 <처럼, 클래스 사이의 관계를 테스트 할 수있는 방법을 제공하기위한 것입니다.

    "내가 그들을 사용해야 할 때?"당신은 당신이해야 알지 못한다면 문제에 관해서는, 대답은, 당신은 안이다. :-) 편집 : 좋아, 좋아, 여기 도서관에서 몇 가지 예입니다. 하나에, 당신은 :

    /**
      * Joins an <code>Either</code> through <code>Right</code>.
      */
     def joinRight[A1 >: A, B1 >: B, C](implicit ev: B1 <:< Either[A1, C]): Either[A1, C] = this match {
       case Left(a)  => Left(a)
       case Right(b) => b
     }
    
     /**
      * Joins an <code>Either</code> through <code>Left</code>.
      */
     def joinLeft[A1 >: A, B1 >: B, C](implicit ev: A1 <:< Either[C, B1]): Either[C, B1] = this match {
       case Left(a)  => a
       case Right(b) => Right(b)
     }
    

    옵션에서, 당신은 :

    def orNull[A1 >: A](implicit ev: Null <:< A1): A1 = this getOrElse null
    

    당신은 컬렉션에 대한 몇 가지 다른 예를 찾을 수 있습니다.

  5. from https://stackoverflow.com/questions/3427345/what-do-and-mean-in-scala-2-8-and-where-are-they-documented by cc-by-sa and MIT license