2013-03-30 78 views
0

對於DSL,我需要隱式擴展函數值。例如:如何在不丟失類型推斷的情況下隱式擴展函數

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函數可以被定義爲這樣的:

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

的問題是在調用takes的代碼。下面按預期工作:

takes((_: String).size) 

但是,如果我在的Elid參數類型編譯失敗來推斷它:

takes(_.size) 

我可以爲了幫助scalac的推斷改變什麼?

OBS:真正的使用情況與此有關:https://gist.github.com/xeno-by/4542402

回答

3

如果你可以讓你的takes功能進行轉換本身,它會工作:

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

(你可以重載takes採取PF或常規功能)。

+0

謝謝!我標記爲正確,因爲它真正解決了我提出的問題。不幸的是,當'pimp'函數被實現爲宏時,它不起作用,但我會分別提出這個問題。 –

相關問題