Scala 3

Equivalencias idiomáticas entre Kotlin y Scala 3. Kotlin se presenta como referencia en cada concepto.

Funciones y abstracciones de comportamiento

Tratar funciones como valores es la base para leer y escribir el resto de las comparaciones: sin esto, los mecanismos posteriores parecen sintaxis arbitraria.

Equivalencia desde Kotlin

Comportamiento como valor

Directa

Scala 3 permite definir métodos y también tratar funciones como valores. La forma curried separa la entrada del valor de función.

Referencia Kotlin: Declarar una operación reutilizable y recibir otra operación como valor.

Mecanismo
Métodos def y valores de función con el tipo Int => Int.
Idea conservada
La transformación se recibe como valor y se invoca dos veces sobre el mismo argumento; quien la declara no necesita conocer applyTwice.
Riesgo de diseño
Asumir que todo método se comporta como un valor de función sin considerar el contexto de adaptación.
Recomendación
Declara el tipo Int => Int cuando una API necesita recibir explícitamente una función.
Convención del curso
Declara el tipo de función explícito cuando la API debe recibir una función, no solo un método.
Mecanismo del lenguaje
Métodos def y valores de función con el tipo Int => Int.

Diferencias relevantes

  • Un método def no es exactamente un valor de función hasta que se adapta al contexto requerido.
  • Los parámetros pueden agruparse en varias listas, como en applyTwice(value)(transform).

El segundo grupo de parámetros recibe un valor de función.

Kotlin
fun applyTwice(
    value: Int,
    transform: (Int) -> Int,
): Int = transform(transform(value))

val result = applyTwice(3) { it + 1 } // 5
Scala 3
def applyTwice(value: Int)(transform: Int => Int): Int =
  transform(transform(value))

val result = applyTwice(3)(_ + 1) // 5

Otra forma de recibir comportamiento: un predicado para filtrar una lista.

def keep(xs: List[Int])(p: Int => Boolean) = xs.filter(p)

Fuentes

Equivalencia desde Kotlin

Parámetros variádicos

Cercana

En Scala 3, parámetro repetido Int* expresa la responsabilidad del fixture: Suma una cantidad variable de enteros.

Referencia Kotlin: Una función recibe vararg values: Int.

Mecanismo
parámetro repetido Int*
Riesgo de diseño
Copiar la sintaxis de Kotlin en vez de usar parámetro repetido Int*.
Recomendación
Expón el contrato del fixture y usa parámetro repetido Int* solo para la garantía que realmente ofrece.

Diferencias relevantes

  • Distingue una llamada variádica de recibir explícitamente una colección.
  • La forma idiomática de Scala 3 debe conservarse aunque la sintaxis difiera de Kotlin.

Suma una cantidad variable de enteros.

def sum(values: Int*): Int = values.sum

Fuentes

Equivalencia desde Kotlin

Interfaces

Cercana

En Scala 3, trait expresa la responsabilidad del fixture: Permite reemplazar un proveedor de resultados por su contrato.

Referencia Kotlin: Una interfaz declara comportamiento sin fijar una representación.

Mecanismo
trait
Riesgo de diseño
Copiar la sintaxis de Kotlin en vez de usar trait.
Recomendación
Expón el contrato del fixture y usa trait solo para la garantía que realmente ofrece.

Diferencias relevantes

  • La conformidad puede ser nominal, estructural o basada en traits; no son la misma garantía.
  • La forma idiomática de Scala 3 debe conservarse aunque la sintaxis difiera de Kotlin.

Permite reemplazar un proveedor de resultados por su contrato.

trait Score:
  def value: Int

Fuentes