2013-03-30 4 views
0

DSL의 경우 함수 값을 암시 적으로 확장해야합니다.형식 유추를 잃지 않고 함축적으로 함수를 확장하는 방법

def takes(f: PimpedFunction[String, Int]) = f.foo 

문제는 takes를 호출하는 코드에 :

trait PimpedFunction[-A, +B] extends Function1[A, B] { 
    def foo = 42 
} 

object PimpedFunction { 
    implicit def pimp[A, B](f: Function1[A, B]): PimpedFunction[A, B] = 
    new PimpedFunction[A, B] { 
     def apply(a: A) = f(a) 
    } 
} 

PimpedFunction를 사용하는 기능과 같이 정의 할 수 있습니다 : 예를 들어.

takes((_: String).size) 

을하지만 입력 매개 변수를 생략하다 경우 컴파일은 추론에 실패 : 같은 다음 작품이 기대

takes(_.size) 

내가 scalac의 추론을 돕기 위해 무엇을 변경할 수 있습니까?

OBS : 실제 사용 사례가이 관련이있다 : 당신이 당신의 takes 기능은 변환 자체를 할 수 있도록 할 수있는 경우 https://gist.github.com/xeno-by/4542402

답변

3

, 그것은 작동합니다 :

def takes(f: Function1[String, Int])(
    implicit f2pf: Function1[String,Int] => PimpedFunction[String,Int] 
) = f2pf(f).foo 

(당신은 takes를 오버로드 할 수 있습니다 PF 또는 정규 함수를 취함).

+0

고마워요! 내가 제시 한대로 문제를 해결 했으므로 올바른 것으로 표시했습니다. 불행히도'pimp' 함수가 매크로로 구현 될 때는 작동하지 않지만 별도로 문제를 제기 할 것입니다. –

관련 문제