Developing
어려운 스칼라의 underscore
mEye
2020. 1. 8. 02:37
스칼라 스터디 중, 다음과 같은 코드가 왜 오류가 발생하는지 의문이 생겼다. (코드는 재구성함)
val t = Seq(1.0,2.0,3.0)
t.map(math.pow(_ + 1,2))
// error: missing parameter type for expanded function ((<x$1: error>) => x$1.$plus(1))
타입 추론이 잘 안되는가 싶어서, 아래와 같이 해도 동일한 오류가 발생한다.
t.map((_:Double) => math.pow(_ + 1,2))
// error: missing parameter type for expanded function ((<x$2: error>) => x$2.$plus(1))
아래와 같이 하면 문제가 없다.
t.map(_+1).map(math.pow(_,2))
혹은, 아래와 같이 하면 문제가 없다.
t.map(x => math.pow(x + 1,2))
이런 현상이 발생하는 이유를 생각해보았다.
- f(_) 는 a => f(a) 와 동일하다.
- _ + 1 은 _.$plus(1) 과 동일하다.
- _.$plus(1) 은 a => a.$plus(1) 과 동일하다.
- math.pow(_ + 1,2) 는 math.pow(a => a.$plus(1),2) 와 동일??
위의 흐름이라면, Double이든 Int 이든 값이 들어가야할 자리에 함수가 들어가면서 문제가 발생한 것으로 보이는데, 맞는지는 잘 모르겠다.