2011-07-08 45 views
4

比方說,我有一個函數,像這樣的簽名:帶有隱含的函數的「類型」是什麼?

def tsadd(key: Any, time: Double, value: Any)(implicit format: Format): Option[Int] 

我想創建一定數量的這些功能後評價的列表。我該怎麼做。我試圖創建一個列表,如:

val pipelineCmds:List[(String,Double,Any)(Format) => Option[Int]] = Nil 

,做這樣的:

pipelineCmds ++ r.tsadd(symbol, timestamp.getMillis.toDouble, value) 

但VAL沒反應以及隱含的PARAM格式。它期望在第一組parens之後看到a]。

的最終目標是做這樣的事情

r.pipeline { p => 
    pipelineCmds.foreach(c => p.c) 
} 

任何幫助,不勝感激!

+0

因爲'(String,Double,Any)(Format)=> Option [Int]'不是一個有效的類型。我沒有任何更好的幫助:) – 2011-07-08 18:07:07

+0

不夠公平。一般來說,你如何將一個函數放入列表中? – jxstanford

+0

你的'p'變量應該是什麼? –

回答

6

據我所知,有隱含參數的功能很煩人的工作。適當的類型是(您的選擇):

(String, Double, Any) => Format => Option[Int] // As written 
Format => (String, Double, Any) => Option[Int] // Conceptually works more like this 
String => Double => Any => Format => Option[Int] // Completely curried 
(String, Double, Any, Format) => Option[Int]  // Closest to how the JVM sees the method 

但該函數的部分應用不能正常工作。您可以煩人註釋所有的類型得到最後版本:

class Format {} // So the example works 
def tsadd(s: String, d: Double, a: Any)(implicit f: Format): Option[Int] = None 
scala> tsadd(_: String, _: Double, _: Any)(_: Format) 
res2: (String, Double, Any, Format) => Option[Int] = <function4> 

但它不是更難寫自己是你想要的任何形狀:

def example(f: Format => (String, Double, Any) => Option[Int]) = f 
scala> example(f => { implicit val fm=f; tsadd _ }) 
res3: (Format) => (String, Double, Any) => Option[Int] = <function1> 

當然,如果你已經知道隱含的價值,當你創建列表,你只需要類型

(String, Double, Any) => Option[Int] 

和你分配的功能,如

tsadd _ 
+0

謝謝。所有的答案都很有幫助,但是這個答案爲我提供了最相關的信息。 – jxstanford

2
scala> val pipelineCmds:List[(String,Double,Any) => Format => Option[Int]] = Nil 
pipelineCmds: List[(String, Double, Any) => (Format) => Option[Int]] = List() 

但請注意,「隱式」從函數值中丟失,您必須顯式傳遞格式。

+0

實際上並不工作 - 你如何在那裏加載函數? –

1

作爲@pst在評論中提到,即使您聲明瞭適當類型的列表,我也不知道如何分配任何內容。

一種解決方案是使用:

def tsadd(key: Any, time: Double, value: Any, format: Format): Option[Int] 

有一個明確的說法format。像往常一樣,您可以將這樣的tsadd函數放入List[...]。然後得到你想要的implicit format行爲您添加到包裝:

def invoke_tsadd(list_selector: Whatever, key: Any, time: Double, value: Any)(implicit format: Format): Option[Int] = 
    selected_from_your_list(list_selector).tsadd(key, time, value, format) 
相關問題