복붙노트

[SCALA] 은`#`연산자는 스칼라에서 무엇을 의미합니까?

SCALA

은`#`연산자는 스칼라에서 무엇을 의미합니까?

스칼라 입력 레벨 프로그래밍 :이 블로그에서이 코드를 참조하십시오

// define the abstract types and bounds
trait Recurse {
  type Next <: Recurse
  // this is the recursive function definition
  type X[R <: Recurse] <: Int
}
// implementation
trait RecurseA extends Recurse {
  type Next = RecurseA
  // this is the implementation
  type X[R <: Recurse] = R#X[R#Next]
}
object Recurse {
  // infinite loop
  type C = RecurseA#X[RecurseA]
}

내가 본 적이 코드 R 번호의 X [R # 다음]의 운영자 #이있다. 그것은, (검색 엔진에 의해 무시)를 검색하기는 어렵습니다 때문에 누가 무슨 뜻 말해 줄 수?

해결법

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

    1.그것을 설명하기 위해, 우리는 먼저 스칼라에서 중첩 된 클래스를 설명해야한다. 이 간단한 예제를 생각해 봅시다 :

    그것을 설명하기 위해, 우리는 먼저 스칼라에서 중첩 된 클래스를 설명해야한다. 이 간단한 예제를 생각해 봅시다 :

    class A {
      class B
    
      def f(b: B) = println("Got my B!")
    }
    

    이제 그것으로 뭔가를 해보자 :

    scala> val a1 = new A
    a1: A = A@2fa8ecf4
    
    scala> val a2 = new A
    a2: A = A@4bed4c8
    
    scala> a2.f(new a1.B)
    <console>:11: error: type mismatch;
     found   : a1.B
     required: a2.B
                  a2.f(new a1.B)
                       ^
    

    당신은 스칼라에서 다른 클래스의 내부 클래스를 선언 할 때 해당 클래스의 각 인스턴스는 서브 클래스를 가지고 있음을 말하고있다. 즉, 더 A.B 클래스가 없지만 a1.B 및 a2.B 클래스가 있습니다, 및 오류 메시지가 위의 우리에게 말하고있는 것처럼 그들은 서로 다른 클래스입니다.

    당신이 이해하지 않은 경우, 경로 의존적 유형을 찾아보십시오.

    특정 인스턴스에 제한없이 이러한 중첩 된 클래스를 참조하는 지금, #이 가능하게한다. 즉, 더 A.B 없다, 그러나 A의 인스턴스의 B 중첩 된 클래스를 의미 A # B는있다

    우리는 위의 코드를 변경하여 작업에서 볼 수 있습니다 :

    class A {
      class B
    
      def f(b: B) = println("Got my B!")
      def g(b: A#B) = println("Got a B.")
    }
    

    그리고 그것을 밖으로 시도 :

    scala> val a1 = new A
    a1: A = A@1497b7b1
    
    scala> val a2 = new A
    a2: A = A@2607c28c
    
    scala> a2.f(new a1.B)
    <console>:11: error: type mismatch;
     found   : a1.B
     required: a2.B
                  a2.f(new a1.B)
                       ^
    
    scala> a2.g(new a1.B)
    Got a B.
    
  2. ==============================

    2.이 유형의 투사로 알려진 및 유형의 멤버에 액세스하는 데 사용됩니다.

    이 유형의 투사로 알려진 및 유형의 멤버에 액세스하는 데 사용됩니다.

    scala> trait R {
         |   type A = Int
         | }
    defined trait R
    
    scala> val x = null.asInstanceOf[R#A]
    x: Int = 0
    
  3. ==============================

    3.기본적으로, 다른 클래스 내에서 클래스를 참조하는 방법입니다.

    기본적으로, 다른 클래스 내에서 클래스를 참조하는 방법입니다.

    http://jim-mcbeath.blogspot.com/2008/09/scala-syntax-primer.html ( "파운드"를 검색)

  4. ==============================

    4.여기에) "기호 연산자"를 검색하기위한 자원 (이 정말 방법이 있습니다), 그러나 나는 "#"을 탈출 scaleX가에에 검색하는 방법을 알아 내지 못했다

    여기에) "기호 연산자"를 검색하기위한 자원 (이 정말 방법이 있습니다), 그러나 나는 "#"을 탈출 scaleX가에에 검색하는 방법을 알아 내지 못했다

    http://www.artima.com/pins1ed/book-index.html#indexanchor

  5. from https://stackoverflow.com/questions/9443004/what-does-the-operator-mean-in-scala by cc-by-sa and MIT license