2014-09-17 19 views
2

주어 두 함수 :스칼라의 부분 애플리케이션은 명확하게 투명하지 않습니까?

def f(a: String, b: Int): Int = a.length + b 
val g: Int => String = _.toString 

이유는 부분적 중간 할당 의해 g으로 f인가 작성할 수 있는지를이다

val f_ = f(_: String, 42) 
f_ andThen g 
// String => String = <function1> 

아니라 직접 :

f(_: String, 42) andThen g 
// error: value andThen is not a member of Int 

이 문제는 형식 추론기 또는 예상되는 동작에 문제가 있습니까?

답변

5

이것은 단지 구문 오류 일 뿐이므로 -Xprint:parser 옵션을 설정하면 표현식과 올바른 표현식의 차이 (예 : (f(_: String, 42)) andThen g)가 표시됩니다.

귀하의 표현 :

((x$1: String) => f((x$1: String), 42).andThen(g)) 

올바른 하나를

((x$1: String) => f((x$1: String), 42)).andThen(g) 

당신은 차이를 볼 수 있습니다. 확장 규칙 때문에 scalac이 발생합니다. scalac은 먼저 도트 형식으로 구문을 정규화 한 다음 확장합니다. 함수 응용 프로그램의이 형식에도 동일한 규칙이 적용됩니다. func(_)이 가장 안쪽의 중괄호로 확장되었으므로 SLS가 작성된 곳을 기억하지 못합니다.