2012-01-05 5 views
5

I 카레와 uncurried 일반적인 기능과 유형 검사의 차이에 의해 혼란 조금 해요 :일반 유형 통일 : 다중 매개 변수 (T, T) 대 다중 매개 변수 목록 (T) (T)?

scala> def x[T](a: T, b: T) = (a == b) 
x: [T](a: T, b: T)Boolean 
scala> def y[T](a: T)(b: T) = (a == b) 
y: [T](a: T)(b: T)Boolean 

내 직감이 모두 x(1, "one")y(1)("one") 유형의 오류를 제공해야한다고했지만, 내가 잘못했다 :

scala> x(1, "one") 
res71: Boolean = false 
scala> y(1)("one") 
<console>:9: error: type mismatch; 
found : java.lang.String("one") 
required: Int 
       y(1)("one") 
       ^

은 처음에는 계속 암시 적 캐스팅의 일종이라고 생각하지만, 그 경우 될 것 같지 않았다

scala> x(1 :Int, "one" :String) 
res73: Boolean = false 

무슨 일 이니? 내 직감은 어떻게해야합니까?

+0

오래 전이 복제본을 보았습니다. 나는 또한이 [거의] 정확한 사례가 SLS에 문서화되어 있다고 믿습니다. –

+0

우리가 간다. 제목을 SLS에서 논의되는 "다중 매개 변수 목록"이라는 중요한 용어로 업데이트했습니다. –

답변

9

나는 첫 번째 경우에 두 개의 인수와 같은 T : Any를 상향 캐스팅한다고 생각합니다. 두 번째로, 그것은 Int를 currying하고 String을 실패합니다.

이 저를지지하는 것 같다

scala> y(1)_ 
res1: Int => Boolean = <function1> 
+0

'y (1 : Any) ("hello")'는'false'를 반환합니다. – rampion

+0

흥미로운 측면 참고로이 –

+0

좀 더 증거를 내 편집을 참조하십시오,이 질문은 여기에서 주장에 전화를 보인다 http://www.scala-lang.org/node/262 "그 후 F (X) (y)와 g (x, y)는 정확히 동일한 코드로 컴파일됩니다. " –

10

스칼라는 한 번 유형에게 하나 개의 매개 변수 블록을 결정하려고합니다.

물론
def x[T](a: T, b: T)(c: T) = (a == b) 
scala> x(1, "one") _ 
res0: Any => Boolean = <function1> 

, 모두 IntStringAny (그리고 ==가 정의 Any에)됩니다 : 당신이 적용 부분적으로 다른 매개 변수를 추가하면이를 볼 수 있습니다. 이전 블록에서 사용되지

유형 매개 변수는 나중에 블록에서 사용하기에 무료로 남아있다 : ​​당신은 나중에 블록에서 기본 값으로 이전 블록을 사용할 수 있습니다

def y[T,U](a: T)(b: U)(c: (T,U)) = (a == b) 
scala> y(1)("one") 
res1: (Int, java.lang.String) => Boolean = <function1> 

!

def z[T,U](a: T)(b: U)(c: (T,U) = (a,b)) = (c._1 == c._2) 
scala> z(1)("one")() 
res2: Boolean = false 

따라서, 여러 파라미터 블록 사이에 파라미터 배신 타입 추론 및 디폴트에 대한 (그리고 일부 애플리케이션의 경우) 모두 영향을 갖는다.

관련 문제