나는 실험적인 라이브러리를위한 DSL을 만들고있다. 나는 스칼라에서 빌드하고 있는데, 스칼라의 타입 추론에 대해 람다 식의 인자와 관련이 있기 때문에 괴롭다. 책 Programming In Scala에서 다루지 않는 것 같습니다.복잡한 스칼라 타입 추론 람다 식에서
내 라이브러리에는 T 유형의 개체에 적용 할 수있는 임시 한정자를 나타내는 데 사용되는 Effect [-T] 특성이 있습니다. 개체 myEffects에 + =는 Effect [PlayerCharacter] 유형의 인수를 받아들입니다. 마지막으로 [T] 일 때 일반적인 방법이 있는데 조건식을 수락하여 조건부 효과를 만들고 다른 효과를 인수로 사용합니다. 다음과 같이 서명은 : 나는 그것이 + = 방법을 초래할 것 통과, 위의 서명과 함께 "때"메소드를 호출
def when[T](condition : T => Boolean) (effect : Effect[T]) : Effect[T]
, 람다 표현식 인수의 유형을 추론 할 수 없습니다.
myEffects += when(_.hpLow()) (applyModifierEffect) //<-- Compiler error
나는 하나의 매개 변수 목록에 스칼라가 잘 람다 식의 유형을 추론 할 수있다 "때"의 인수를 결합합니다.
def when[T](condition : T => Boolean, effect : Effect[T]) : Effect[T]
/* Snip */
myEffects += when(_.hpLow(), applyModifierEffect) //This works fine!
두 번째 매개 변수를 완전히 제거해도 작동합니다.
def when[T](condition : T => Boolean) : Effect[T]
/* Snip */
myEffects += when(_.hpLow()) //This works too!
그러나, 심미적 인 이유로, 난 정말 인수가 별도의 매개 변수 목록으로 "때"메서드에 전달되어야합니다.
Programming in Scala의 16.10 절을 이해하면 컴파일러는 먼저 메서드 형식을 알고 있는지 여부를 확인하고 예상되는 형식의 형식을 유추하는 데 사용합니다. 이 경우 가장 바깥 쪽 메서드 호출은 + =이며 Effect [PlayerCharacter] 형식의 인수를 받아들입니다. [T]가 Effect [T] 일 때의 리턴 타입은 결과가 전달되는 메소드가 Effect [PlayerCharacter] 타입의 인수를 기대하기 때문에 T는 PlayerCharacter이고 따라서 람다의 타입 expression이 "when"이 PlayerCharacter => Boolean 인 첫 번째 인수로 전달되었습니다. 이것은 인수가 하나의 매개 변수 목록에 제공 될 때 작동하는 것처럼 보입니다. 그렇다면 인수를 두 개의 매개 변수 목록으로 나누면 왜 작동하지 않습니까?
http://pchiusano.blogspot.com/2011/05/making-most-of-scalas-extremely-limited.html – retronym