F#

Equivalencias idiomáticas entre Kotlin y F#. 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

F# define funciones con let y las trata como valores. La aplicación de argumentos se escribe con espacios y el operador de tubería permite leer una transformación de izquierda a derecha.

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

Mecanismo
Un enlace let que produce una función; la aplicación parcial y las funciones son centrales en el lenguaje.
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
Agregar paréntesis y comas como en C# o Kotlin, cambiando la forma de aplicación esperada.
Recomendación
Empieza con funciones pequeñas y curried; usa tuplas solo cuando los argumentos forman un valor compuesto.
Convención del curso
Empieza con funciones pequeñas y curried; usa tuplas solo cuando los argumentos forman un valor compuesto.
Mecanismo del lenguaje
Enlaces let con funciones curried de primera clase.

Diferencias relevantes

  • La aplicación de función no usa paréntesis ni comas entre argumentos como regla principal.
  • Las funciones suelen estar curried, lo que habilita aplicación parcial de forma natural.

La transformación se recibe primero y se aplica dos veces con una tubería.

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

val result = applyTwice(3) { it + 1 } // 5
F#
let applyTwice transform value =
    value |> transform |> transform

let result = applyTwice (fun number -> number + 1) 3 // 5

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

let keep predicate values = values |> List.filter predicate

Fuentes

Equivalencia desde Kotlin

Parámetros variádicos

Cercana

En F#, una lista o secuencia explícita expresa la responsabilidad del fixture: Suma una cantidad variable de enteros.

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

Mecanismo
una lista o secuencia explícita
Riesgo de diseño
Copiar la sintaxis de Kotlin en vez de usar una lista o secuencia explícita.
Recomendación
Expón el contrato del fixture y usa una lista o secuencia explícita 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 F# debe conservarse aunque la sintaxis difiera de Kotlin.

Suma una cantidad variable de enteros.

let sumValues values = List.sum values

Fuentes

Equivalencia desde Kotlin

Interfaces

Cercana

En F#, tipo de interfaz .NET 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
tipo de interfaz .NET
Riesgo de diseño
Copiar la sintaxis de Kotlin en vez de usar tipo de interfaz .NET.
Recomendación
Expón el contrato del fixture y usa tipo de interfaz .NET 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 F# debe conservarse aunque la sintaxis difiera de Kotlin.

Permite reemplazar un proveedor de resultados por su contrato.

type IScore = abstract member Value: unit -> int

Fuentes