Как я могу определить анонимную общую функцию Scala?

Допустим, у меня есть это:

val myAnon:(Option[String],String)=>String = (a:Option[String],defVal:String) => {
  a.getOrElse(defVal)
}

Не обращайте внимания на то, что делает функция. Можно ли как-то сделать его универсальным, чтобы у меня был Option[T]?


person Geo    schedule 31.03.2010    source источник


Ответы (2)


Подводя итог этому ответу: нет, вы не можете сделать анонимные функции универсальными, но вы можете явно определить свою функцию как класс, который расширяет один из признаков Function0, Function1, Function2 и т. д. и определите функцию применения из этих трейтов. Тогда класс, который вы определяете, может быть универсальным. Вот выдержка из исходной статьи, доступная здесь:

scala> class myfunc[T] extends Function1[T,String] {
     |     def apply(x:T) = x.toString.substring(0,4)
     | }
defined class myfunc

scala> val f5 = new myfunc[String]
f5: myfunc[String] = <function>

scala> f5("abcdefg")
res13: java.lang.String = abcd

scala> val f6 = new myfunc[Int]
f6: myfunc[Int] = <function>

scala> f6(1234567)
res14: java.lang.String = 1234
person Jeremy Bell    schedule 02.04.2010
comment
Можно также написать это более идиоматически как extends (T => String) { - person Luigi Plinge; 29.06.2013

Я не думаю, что анонимные функции могут иметь параметры типа. Подробности см. в этом ответе.

person Ben Lings    schedule 31.03.2010