2011-07-08 3 views
4

Скажем, у меня есть функция, с подписью, как это:Что такое «тип» функции с implict?

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) 

Но вал не реагировал хорошо неявный формат пары. Он ожидает увидеть] после первого набора парнеров.

Конечная цель состоит в том, чтобы сделать что-то вроде

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

Любая помощь очень ценится!

+0

Потому что '(String, Double, Any) (Format) => Option [Int]' не является допустимым типом. У меня нет никакой лучшей помощи :) –

+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) 
Смежные вопросы