2012-03-08 4 views
2

내가 스칼라 라이브러리를 볼 때 나는 이와 같은 코드를 본다. 왜 테스트를 넣어야합니까 [A].함수 옆에 제네릭 형식을 넣는 이유는 무엇입니까?

def test[A](block : Int => Unit) : Unit = { 
     block(10) 
    }  

    test { u => 

     println(u)   
    } 

이것은 내가 생각하는 것과 같이 유효합니다. 그것은 같은 방식으로 실행됩니다.

def test(block : Int => Unit) : Unit = { 
      block(10) 
     } 

나는 그저 추론 (또는 디자인 패턴)이 무엇인지 궁금해했습니다. 감사.

+1

스칼라 라이브러리에서 구체적인 예를 제공 할 수 있습니까? 이것은 내가 일반적으로 보는 것이 아닙니다. (나는 한 가지 예를 생각할 수 없다.) –

+2

이것은 관련되었을 수있다 : http://stackoverflow.com/questions/7933786 –

+0

고마워! 그것은 그것을 설명하는 것 같다. 여기 내가 본 코드입니다. https://github.com/playframework/Play20/blob/master/framework/src/play/src/main/scala/play/api/db/DB.scala 특히 withConnection 기능. 이 예제에서는 내 예제가 이해가되지 않지만 블록의 반환 코드로 Unit 유형을 제공하고 있기 때문입니다. –

답변

7

유형 매개 변수 A은 사용되지 않았기 때문에 여기서는 의미가 없습니다.

def test[A](block: Int => A): A = block(10) 

여기서 A은 반환 유형을 지정합니다.

+0

그러나 함수 이름 옆에있는 A는 어떻게 사용됩니까? 반환 블록 서명으로 어떻게 사용되는지 알 수 있습니다. –

+0

@DrewH : "함수 이름 옆에있는 A는 어떻게 사용합니까?"라는 것은 무엇을 의미합니까? A는 호출 할 때 컴파일러에 의해 유추됩니다. 'test {i => new Test (i)}'는 주어진 i로 Test의 인스턴스를 생성합니다. 컴파일러는 A 유형으로 Test를 유추합니다. – sschaef

1

함수 옆에 제네릭 형식이 있으면 해당 함수가 제네릭 함수임을 의미합니다. 당신이 볼 수 있듯이

// generic functions which returns type of `A` 
def test1[A](x: A) = x 
def test2[A](x: => A) = { println("Hello"); x } 

val x1 = test1(1) 
// x1: Int = 1 

val x2 = test1("Hello World") 
// x2: java.lang.String = Hello World 

val x3 = test2(123.4) 
// Hello 
// x3: Double = 123.4 

val x4 = test2("Test2") 
// Hello 
// x4: java.lang.String = Test2 

, test1test2의 반환 형식은 해당 인수의 유형에 의해 결정됩니다

다음은 아주 간단한 예이다.

다음은 또 다른 사용 사례입니다.

// We could implement `map` function ourself. 
// We don't care about what type of List contains, 
// so we make it a generic function. 
def map[A, B](xs: List[A], f: A => B): List[B] = { 
    var result: List[B] = Nil 
    for (i <- xs) { 
     result ++= List(f(i)) 
    } 
    result 
} 

// Now use can map any type of List to another List. 
map(List("1", "2", "3"), (x: String) => x.toInt) 
//res1: List[Int] = List(1, 2, 3) 
관련 문제