style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Hello World x4

Hace poco estuve en un curso relativo a Kafka, la verdad la capacidad que tiene esa herramienta es muy fuerte, sobre todo cuando aplicamos programación funcional en medio. Aunque este post no es relativo a Kafka, si lo es relativo a la programación funcional y será bastante sencillo.

Haremos un ejemplo de curry f(x)(y) = f(x, y) en tres lenguajes Kotlin, Typescript y Javascript.

Kotlin

fun main() {
    val sendAll = { content: String ->
        { content2: String ->
            content + content2
        }
    }

    val a = sendAll("Hello")

    println(a(" World"))
}

Typescript

const sendAll = (content: string) =>
  (content2: string) => content + content2;

const a = sendAll("Hello”);

console.log(a(" World”));

Javascript

const sendAll = content => content2 => content + content2;

const a = sendAll("Hello”);

console.log(a(" World”));

Conclusiones

A mi me sigue gustando más javascript (porque escribes menos), pero a muchos les gusta que el editor les diga que puede haber un error y muchos claman que usar tipos reduce errores, en la practica javascript se usa con linters y cachan en general el mismo numero de errores de sintaxis. Kotlin por otra parte me sigue pareciendo un lenguaje más entendible que Java.

Las diferencias entre typescript y kotlin me parecen bastante pequeñas, puede ser una gran ayuda para equipos mixtos donde unos programan en el servidor y otros en el front, el cambio de un lado al otro seria mas sencillo, creo yo.

Actualizado

Originalmente queria incluir rust, pero si esta un poco mas complicado, hay que entender mejor el sistema de prestado de memoria. Algo hay que perder cuando ganamos memoria y thread safety sin garbage collector a velocidad de c++, en fin, pero si se puede:

Rust

fn send_all(content: &'static str) -> impl Fn(&str) -> String {
    move | content2: &str | {
        content.clone().to_owned() + content2
    }
}

fn main() {
    let a = send_all("Hello");
 
    println!("{:?}", a(" World"));
}

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de Sr. Negativo

Buen contenido

Es increíble como evolucionan los lenguajes como Java y otros surgen para paliar las deficiencias de éstos. Kotlin tiene aspectos (programación funcional, etc.) que lenguajes como Groovy, Scala y otros más intentaron promover o difundir. Algunos les hicieron caso, otros muchos no.

Mucha gente no sabe que las lambdas ya estaban presentes en lenguajes como Python. Java, para no quedarse atrás, lo adaptó a las nuevas versiones (desde la 8).

Java 11 promete muchas cosas y otras no se esperaban, pero se temían...

Imagen de Jvan

Uno más

Aqui como se hace en Scala

  1. def sendAll(content1: String)(content2: String) = content1 + content2 // with curry syntax
  2. val world = sendAll("hello ") _
  3. println(world("world"))
  4.  
  5. // or just
  6. sendAll("hello ")("world") // If you don't need a partial result
  7.  
  8. // example 2 with "normal" syntax
  9. def sendAll2(content1: String, content2: String) = content1 + content2
  10. val world = sendAll2(_, " world")
  11. println(world("hello")) // => hello world

El ejemplo2, internamente el compilador lo convierte en una partial function cuando le mandas el placeholder "_".

La ventaja del ejemplo 2 es que con el placeholder puedes parcializar N parametros en tu función por ejemplo.

  1. def sum4(a: Int, b: Int, c: Int, d: Int) = a + b + c + d
  2. val sumAD = sum4(1,_,_,1)
  3. val sumBC = sumAD(2, 2) // => 6

Java

import java.util.function.*;
class Fxy {
    public static void main(String ... args) {
        // Funcion que recibe String y regresa
        // una function que recibe y regresa String
        Function<String,Function<String,String>> sendAll = (String content) -> (String content2) -> content + content2;
        var a = sendAll.apply("Hello ");
        System.out.println(a.apply("world"));

    }
}

Para que

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">