es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Scala – ¿es posible escribir una HOF que tenga varargs?

¿Puedo tener una función de orden superior que devuelva una func(varargs*), por ejemplo, (s: String*) => String?

Estoy intentando hacer lo siguiente:

  def concatKeys(delimiter: String) = {
    def concat(k1: String, k2: String): String = if (k1.isEmpty) k2 else k1 + delimiter + k2

<pre><code>(keys: String*) => keys.foldLeft("")(concat)
</code></pre>

<p>}

Pero cuando lo uso como se espera, el código no se compila:

      val key: String = concatKeys(delimiter)(keyAcc, kv._1)</p>

Si lo cambio a un Traversable:

  def concatKeys(delimiter: String) = {
    def concat(k1: String, k2: String): String = if (k1.isEmpty) k2 else k1 + delimiter + k2

<pre><code>(keys: Traversable[String]) => keys.foldLeft("")(concat)
</code></pre>

<p>}
<code>
Se compila naturalmente:
</code>
      val key: String = concatKeys(delimiter)(Set(keyAcc, kv._1))

Entonces, ¿no es posible devolver un HOF con varargs? Si no, ¿por qué no?

¡Gracias a todos!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    No es posible devolver una función de orden superior con argumentos variables en Scala porque los argumentos variables se expanden en un array por el compilador, y las funciones que devuelven arrays no pueden utilizarse como funciones de orden superior porque no siguen la firma de función esperada.

    En el ejemplo proporcionado, al cambiar la firma de la función para aceptar un Traversable[String] en lugar de String*, se permite que la función se use como una función de orden superior, ya que ahora sigue la firma de Function1 esperada.

    Es importante tener en cuenta que esta limitación no es específica de Scala y es una restricción común en muchos lenguajes de programación que admiten funciones de orden superior.

Comments are closed.