2016-10-01 4 views
-3
object Demo { 
    def main(args: Array[String]) { 
     println(apply(layout, 10)) 
    } 

    def apply(f: Int => String, v: Int) = f(v) 

    def layout[A](x: A) = "[" + x.toString() + "]" 
} 

def layout[A](x: A) 함수에서 [A]은 무엇을 나타 냅니까?아래에서 설명하십시오. 스칼라 코드

+0

스칼라 질문을하기 전에 http://stackoverflow.com/documentation/scala/782/type-parameterization-generics#t=201610012036290314627 –

+0

를 참조 이유의 기초를 배울 먼저 언어? – Madoc

답변

1

스칼라의 일반적인 클래스입니다. http://docs.scala-lang.org/tutorials/tour/generic-classes.html

java를 알고있는 경우 [A]은 Java에서 <A>과 같습니다.

<A> String layout(A x){ 
    return "[" + x.toString() + "]"; 
} 
+0

그래서 그것의 사용법은 ... 나는 def 레이아웃 (A : x)를 def 레이아웃 (x : Int)으로 바꿨다. –

+0

차이점은 제네릭 코드는 모든 유형의 입력에 사용할 수 있다는 것입니다. int가 아닌 다른 형식의 매개 변수를 전달하여이 메서드를 호출하면 인수가 Int x 인 코드가 실패합니다. –

1

[A]A라는 이름의 형식 매개 변수가 선언처럼

등가 자바 코드가 보일 것이다.

하스켈 같은 구문

은 이러한 유형

layout :: forall a. a -> String 
+0

그래서 그것의 사용법은 ... def 레이아웃 (A : x)를 def 레이아웃 (x : Int)으로 바꿨고 완벽하게 작동합니다. –

+0

매개 변수가있는 함수는 모든 유형의 값으로 호출 할 수 있습니다. 'x'의 타입을'Int'로 변경하면 함수는'Int' 타입의 값으로 만 호출 될 수 있습니다. –

1

비 일반적인 방법으로 기록 될 알려진 유형 파라미터이다 : 위 예에서

def layout(x: Int) = "[" + x.toString() + "]" //parameter x is of a known type: Int 

은 X가 명시 적으로 설정된 Int가 되라. 그러나 toString 메서드는 Scala의 모든 유형에 적용 할 수 있습니다. 그래서, 대신에 다음과 같은 다양한 유형의 여러 오버로드 된 메서드 쓰는 :

def layout(x: Double) = "[" + x.toString() + "]" //parameter x is of a known type: Int 

def layout(x: List[Int]) = "[" + x.toString() + "]" //parameter x is of a known type: Int 

을 우리는 형식 매개 변수를 사용하여 단일 일반/다형성 방법을 쓸 수 있습니다 :

위의 A는 형식 매개 변수라고
def layout[A](x: A) = "[" + x.toString() + "]" 

. 이제 A은 어떤 유형의 것이 될 수 있습니다. 실제 유형에 대한 추상화입니다.

layout[Int](2) 

아니면 단순히 다음과 같이 호출 할 수 스칼라가 자동으로 파라미터 화 된 형태 A이의 것으로 추정되는 경우 :

이제 명시 적으로 A의 유형을 지정하여 다형성 layout 메소드를 호출 할 수 지능을 입력

layout(2)