2013-10-13 26 views
2

我想要定義一個通用的方法,它的參數和返回類型。基本上爲JSON序列化/從case類創建一個輔助函數。如何推斷類型當一個是返回值?

所以我想寫這樣的僞代碼:

def post[Request,Response](data:Request) : Response = ??? 

case class A(i:String) 
case class B(j:Int) 

val result = post[A,B]("input") 

在這種情況下(假設沒有錯誤)結果是B型的

這是可以理解的是,編譯器不能推斷返回值,但我想它推斷請求類型。換句話說,我想寫點東西像

val result = post[B]("input") 

其中A的類型由數據推斷參數,所以調用函數時,用戶只需要指定返回類型。

+0

我希望有一個不那麼複雜的答案。在這一點上,我認爲只提供這兩種類型參數會更容易。 – shawnT

回答

2

我並不清楚Scala的許多細節,但是在Haskell中,通過一個名爲「Functional dependencies」的編譯器選項啓用了該功能,因此您有一個帶有兩個類型變量的類型類型,其中一個類型可以從其他 - 參見http://www.haskell.org/ghc/docs/6.6/html/users_guide/type-extensions.html的第7.4.3節。顯然,你不能僅僅使用這個功能,因爲它使用了不同的語言,但知道它的名稱應該可以幫助你找到解決方案。例如,Functional dependencies in Scala看起來不錯,雖然我再也不知道Scala閱讀那篇文章,然後告訴你如何回答你最初的JSON問題。

+0

我想我需要學習Haskell;至少有一點點。 – shawnT

1

從@ amalloy的回答繼,他提供了一個鏈接,斯卡拉相當於你正在努力實現將類似以下內容:

trait ReqResp[Request,Response] { 
    def apply(req: Request): Response 
} 

def post[Request,Response](data:Request)(implicit rr: ReqResp[Request,Response]): Response = rr(data) 

case class A(i:String) 
case class B(j:Int) 

implicit object reqRespAB extends ReqResp[A,B] { 
    def apply(a: A) = B(a.i.toInt) 
} 

val result = post(A("456")) 

這使輸出:

result: B = B(456) 
+0

這也是一種附加方式嗎?你會推薦哪個? http://stackoverflow.com/questions/10726222/simulate-partial-type-parameter-inference-with-implicits?rq=1 – shawnT

相關問題