Как бы я карри функцию String.format, чтобы использовать ее с картой над массивом? - PullRequest
2 голосов
/ 31 января 2012

У меня есть массив строк, и мне нужно превратить их в строки в кавычках. Очевидно, я мог бы просто перебрать массив и использовать что-то вроде "\"%s\"".format(elem) для замены каждого элемента, но это кажется безобразным, учитывая, что мой следующий шаг будет arr.mkString("(", "OR", ")")

Я попытался карри String.format следующим образом:

val curried = "\"%s\"".format(_)
arr.map(curried)

Но это не работает и жалуется:

 found   : (Any*) => String
 required: (java.lang.String) => ?

Как мне сопоставить функцию, такую ​​как String.format, с массивом строк? Есть ли другой способ его проклясть или, возможно, мне следует указывать типы?

Ответы [ 2 ]

8 голосов
/ 31 января 2012

Вам нужно немного помочь компилятору и указать нужный тип (по крайней мере, это одно из возможных решений вашей проблемы):

val curried = "\"%s\"".format(_: String) 

В противном случае компилятор выдаст функцию Seq[Any] => String, потому что метод format имеет переменные.

1 голос
/ 31 января 2012

Путем написания общего unvararg возможно.(Функция, которая преобразует (A*) => B в Seq[A] => B.)

scala> def unvararg[A, B](f: (A*) => B): Seq[A] => B = x => f(x: _*)
unvararg: [A, B](f: A* => B)Seq[A] => B

scala> def seqSingleton[A](x: A): Seq[A] = Seq(x)
seqSingleton: [A](x: A)Seq[A]

scala> val ss = Array("hello", "world")
ss: Array[java.lang.String] = Array(hello, world) 

scala> ss.map((seqSingleton[String] _) andThen unvararg("\"%s\"".format))
res8: Array[String] = Array("hello", "world")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...