이 :
는 가
test2(y => test1(x => 2*x)(y))(2)
이
여러 인수 목록과 스칼라의 방법은 다른 언어 카레 기능과 같은 많은 역할을 할 수 있지만,이 방법으로 구현됩니다 사실 그 필요 :
test2(test1(x => 2*x))(2)
이로 확장 모든 매개 변수는 구문에 표시됩니다. 예를 들어 이것을 REPL에 넣으면 다음과 같습니다 :
test1(x => 2*x)
인수가 누락되었다고 불평 할 것입니다. 이 구문이 허용하는 것은 메서드가 함수로 변환되는 "η 확장"입니다. 당신이 작성하는 경우 :
val func: Int => Int = test1(x => 2*x) _
을 당신은 test1
부분적으로 적용 나타내는 기능을 얻을 수 있습니다. 스칼라는 문맥에 따라 자동으로 η 확장을 수행 할 것이고, 이는 test2(test1(x => 2*x))(2)
에서 일어난다. test1
자체는 결코 함수를 반환하지 않지만 컴파일러는 필요할 때 함수를 기반으로 함수를 빌드합니다. 당신이 test1
같이 정의하면
그러나 :
는
def test1(f : Int => Int) = (x : Int) => x + f(x)
그리고 컴파일러는 _
없이 test1(x => 2*x)
을 받아 들일 것입니다.또한 기본 구현에서 test1
으로 고정 된 클로저를 구현하는 클래스는 단 하나만 존재하지만 원래 정의에서는 모든 부분 적용 test1
을 사용하면 새 클래스가 만들어집니다. 반대로 클로저가 항상 만들어지기 때문에 두 매개 변수를 모두 사용하면 효율성이 떨어집니다.
자, 스칼라가이 경우 cura 함수를 구현하기 위해 η 확장을 사용하고 있다고 말할 수는 있지만, test1이 함수를 반환한다고 생각하도록 권장할까요? – ekinrf
일종. 다중 매개 변수 목록에는 currying이 구현되어 있다고 제안하는 문서가 많이 있지만 실제 currying을 사용하는 것처럼 맹목적으로 사용할 수는 없으며 여러 매개 변수 목록이있는 대부분의 메서드 인스턴스는 부분적으로 사용되는 것이 아닙니다. 'list.foldLeft (0)'은 드뭅니다. 내 새로운 편집보기 - 진정한 카레 드 된 방법/기능을 만드는 방법을 보여줍니다. – wingedsubmariner