[Scala] Hilo General - Solo personas funcionales y distribuidas

vago_21

Qué es Scala?

Scala es un lenguaje de programación multi-paradigma diseñado para expresar patrones comunes de programación en forma concisa, elegante y con tipos seguros. Integra sutilmente características de lenguajes funcionales y orientados a objetos. La implementación actual se ejecuta en la máquina virtual de Java y es compatible con las aplicaciones Java existentes.

Scala fue creado por Martin Odersky.

Características

Orientación a objetos

Scala es un lenguaje de programación puro orientado a objetos, en el sentido de que cada valor es un objeto. El tipo y comportamiento de los objetos se describe por medio de clases y traits. La abstracción de clases se realiza extendiendo otras clases y usando un mecanismo de composición basado en mixins como un reemplazo limpio de la herencia múltiple.

Lenguaje funcional

Scala también posee características propias de los lenguajes funcionales. En Scala las funciones son valores de primera clase, soportando funciones anónimas, orden superior, funciones anidadas y currificación. Scala viene integrado de fábrica con la técnica de pattern matching para modelar tipos algebraicos usados en muchos lenguajes funcionales.

Tipificado estático

Scala está equipado con un sistema de tipos expresivo que refuerza a que las abstracciones de tipos se usen en forma coherente y segura.

Extensibilidad

Scala se diseñó teniendo en mente el hecho de que en la práctica el desarrollo de aplicaciones requiere a menudo de extensiones específicas del lenguaje. Para ello, Scala proporciona una combinación única de mecanismos que hacen fácil y sin problemas agregar construcciones nuevas al lenguaje en forma de bibliotecas.

Inmutabilidad

Como lenguaje funcional, una de sus principales características es la inmutabilidad, Scala se asienta sobre muchos conceptos matemáticos que requieren de la inmutabilidad para seguir siendo válidos.

¿Cómo empiezo?

Lo más común es usar Intellij IDEA de Jetbrains con el plugin de Scala.

En mi caso prefiero usar VS Code porque es lo que uso en mi día a día y ya lo tengo tuneado con el plugin de VIM, atajos de teclado etc, así que estoy usando VS Code + Metals. Me ha soprendido lo bien que funciona, además, VS Code es más ligero que Intellij Idea.

Tanto Metals como Intellij permiten crear unos archivos llamados "worksheets" que vienen a ser como los "playgrounds" de Swift.

Una worksheet es un archivo scala con extensión .sc que puede ejecutar y obtener los resultados de la evaluación en una vista especial que aparece en el editor.

¿Para qué se usa?

Es común verlo en entornos de procesamiento de big data, se suele usar junto con Spark, Kafka y Akka. Estas herramientas, además de ser proyectos con gran impacto en el mercado, fueron construidas intencionadamente en Scala.

Decir también que la curva de aprendizaje de este lenguaje para los que venimos de otros no funcionales es bastante grande, aún así os animo a probar, yo estaba muy ciego con Python hasta que he empezado a hacer cosillas con Scala.

No soy ningún experto en Scala, pero encantado de ayudar y recibir ayuda.

Buen foro

3
PiPePiTo

En el curro lo estamos usando para hacer tests con Gatling y la relación amor/odio que estoy teniendo está siendo intensa.

Pero una vez le coges el truco y aprender la diferencia entre val y var... La cosa ya avanza xD

1 1 respuesta
vago_21
#2PiPePiTo:

la relación amor/odio que estoy teniendo está siendo intensa

jajajajaj te entiendo bien.

Yo lo que peor llevo sin duda alguna son la HOF y la recursividad compleja

MTX_Anubis

Obligatorio:

https://www.mediavida.com/foro/dev/programacion-funcional-scala-clojure-etc-446872

1 respuesta
vago_21

#4 sabía que existía, pero lleva tiempo muerto y no es específico de Scala, me he leído las normas antes y ponía que antes de reflotar algo viejo, casi mejor crear uno nuevo, así que siendo este específico de Scala, me he tirado a la piscina

Phatality

Lo uso en el dia a dia con un framework llamado Scio (apache beam) para big data jobs. Demasiada magia y complejidad innecesaria a veces.

1
1 mes después
vago_21

Dejo por aquí un ejemplo de .gitignore para proyectos de Scala.

Hay un apartado por cada ide que uséis Eclipse, VSCode, Intellij IDEA etc

https://alvinalexander.com/source-code/scala/sample-gitignore-file-scala-sbt-intellij-eclipse/

kirk01

¿Recomendáis Scala para alguien que está empezando a programar? Me da la impresión de que este lenguaje está más orientado a gente con experiencia que vienen de otros lenguajes como Java, C#, etc.

¿Sería muy difícil encontrar trabajo de Scala sin experiencia previa? como junior, vamos.

Llevo varios días mirando la documentación y el handbook y de momento me parece la mejor que he visto, además de que me ha gustado bastante la sintaxis del lenguaje.

2 respuestas
vago_21

#8 Si estás empezando a programar no te recomiendo Scala, tiene una curva de aprendizaje muy alta.

Sobre el curro, a mí me han ofrecido siendo junior en Scala, pero ya llevo 10 años picando en otro lenguaje.

Yo cuanto más pico scala, menos me gustan el resto de cosas

1 1 respuesta
kirk01

#9 Gracias, lo suponía.. bueno, igualmente intentaré seguir aprendiendo Scala y ver si puedo ampliar mis conocimientos de OOP con este lenguaje. Llevo unos meses con Java y ya le he cogido una tirria tremenda.

1
desu

#8 leete el redbook

es un gran libro para aprender a programar

da igual que no tengas experiencia

tansolo saltate la OOP y centrate en tener cosas funcionales peque;as

el unico problema de scala que encontraras es la complejidad, muchas keywords y patrones para hacer cosas que realmente son muy faciles y simples pero en el lenguaje no estan tan bien integradas como otros funcionales.

tansolo es eso, complejidad.

pero a nivel individual te aportara lo mismo que cualquier otro lenguaje del palo.

yo no te lo recomiendo si crees que la complejidad te supondra demasiado esfuerzo. pero prueba los primeros capitulos.

1 2 respuestas
kirk01

#11 pues tiene muy buena pinta el libro, además que en la web dice que está enfocado para gente que no tiene ni idea de FP

justamente estaba pensando en pillarme este otro de manning... https://www.manning.com/books/get-programming-with-scala, pero parece que el redbook es mejor para noobs como yo

gracias!

2 respuestas
vago_21

#12 yo tengo el redbook que también me lo recomendó #11 y es una pasada, hay muchos ejemplos y ejercicios que debes resolver, los tienen todos hechos aquí por si te atascas en alguno:

https://www.scala-exercises.org/fp_in_scala/getting_started_with_functional_programming

1
vago_21

#12 y otra cosa, por reddit y más sitios en general oirás mucho hablar de usar VSCode + Metals como entorno de desarrollo para Scala. Olvídate, le queda muchísimo a esto todavía. Yo lo estuve probando un tiempo porque en el curro uso VSCode y estoy más acostumbrado pero para Scala es basura.

Intellij IDEA sin dudarlo

2
desu

Si y el problema es la complejidad en si del lenguaje, no de las ideas, i.e:

def isSorted[A](as: Array[A], ordering: (A, A) => Boolean): Boolean = {
  @annotation.tailrec
  def go(n: Int): Boolean =
    if (n >= as.length - 1) true
    else if (!ordering(as(n), as(n + 1))) false
    else go(n + 1)
  go(0)
}

en otro lang com haskell seria algo asi:

  • isSorted acepta una lista de A y devuelve bool
  • donde A es un generico que implementa Ord (para tener orden)
  • lista vacia y 1 elemento siempre True
  • 2 elementos pues los comparas
  • 2 elementos y una lista, comparas los elementos y el resto recursivo... fin
isSorted :: Ord a => [a] -> Bool
isSorted []  = true
isSorted oneElement = true
isSorted (head : tail) = head > tail
isSorted (first : second : xs)  = first > second and isSorted (second ++ xs) 

Todo se compone mas facil, tiene sintaxis mas entendible (si no haces el bobo).

En scala para algo tan facil fijate todo lo que necesita.

Si quieres tener la misma firma que en scala pero en haskell, pasandole el predicado de ordering como parametro podrias hacer:

isSorted :: Ord a => [a] -> Predicate -> Bool
isSorted [] _   = true
isSorted oneElement _  = true
isSorted (head : tail) p   = p head tail
isSorted (first : second : xs) p  = (p first second) and (isSorted (second ++ xs) p)

Pongo parentesis para que te sea mas entendible.

Pues bueno como haskell tienes otros diez lenguajes funcionales que en 4 lineas haras lo que scala hace en 20.

Para que necesitas esa anotacion de tail rec? que es eso de go? que es esa sintaxis tan verbosa? Scala estaria mejor si fuese asi y funcionase igual que arriba:

def isSorted(as: Array[A], ordering: (A, A) => Boolean): Boolean = {
    if (as.length <= 2) true
    else if (!ordering(first(as), second(as))) false
    else isSorted(second(as), tail(as), ordering)
}

Disclaimer; hace a;os que no toco haskell y no esta perfecto, pero pa que se entienda.

1 1 respuesta
kirk01

#15 el código de Scala lo he entendido bien en su gran mayoría, pero con el de Haskell me he perdido salvo por 2 o 3 cosas, algo normal supongo porque no estoy acostumbrado a lenguajes FP puros

pero ya veo lo que quieres mostrarme, y que la sintaxis de haskell queda más "limpia"

1 respuesta
desu

#16 Te lo hago en typescript si quieres, he hecho haskell porque he dicho ostia hace tiempo que no hago

function isSorted<Type>(list: Type[]): boolean {
    return (list.length == 0 || list.length == 1) ? true
        : (list.length == 2) ? list[0] < list[1]
        : list[0] < list[1] && isSorted(list.slice(1))
}

Lo importante es que veas que el patron es el mismo... da igual el lenguaje, solo cambia sintaxis

En scala tienes el @tailrec y el go por detalles de implementacion, eso te da igual cuando aprendes

Lo mejor para aprender si no te da miedo la sintaxis es meterte con Scheme o Racket. Te lo dejo en Racket:

(define (is-sorted xs)
  (cond
    [(<= (length xs) 1) true]
    [(= (length xs) 2) (< (first xs) (second xs))]
    [else (and 
        (< (first xs) (second xs)) 
        (is-sorted (list-tail xs 1)))]))

Que aqui cuesta solo entender la notacion y no liarte con los parentesis, pero en unos dias practicandolo ni te enteras y es el lang mas facil de entender XD

Como puedes ver 4 lang funcionales, siempre igual... cambia sintaxis. lo que tienes que aprender es la idea y ganar un poco de soltura.

1
17 días después
vago_21

A raíz de mi nuevo empleo, me han salido muchos haters diciendo que Spark está deprecated, que ahora se usa Dask + Python, pero en mi jornada de estudio de hoy, he estado viendo los Datasets, que se incluyeron en Spark 3. Éstos son una evolución de los dataframes, pero sorpresa!! la api de Datasets no está disponible en Python, solo en Scala y Java, por el tema de las case class de Scala.

Como moraleja, no influirme por opiniones de otros, menos todavía si son fanboys de python

1
vago_21

Microsoft presenta SynapseML: A simple, multilingual, and massively parallel machine learning library.

SynapseML es una biblioteca de código abierto creada para simplificar la creación de pipelines de machine learning escalables y distribuidas. Puede usarse con varios lenguajes de programación: Python, R, Sacala y Java.

Con SynapseML, los desarrolladores pueden construir sistemas escalables e inteligentes para resolver diferentes problemas, entre los que destaco:

  • Anomaly detection
  • Computer vision
  • Deep learning
  • Gradient boosting
  • NLP

+Info

En cuanto me asiente un poco en el trabajo nuevo me gustaría probar la herramienta

Usuarios habituales

  • vago_21
  • desu
  • kirk01
  • Phatality
  • MTX_Anubis
  • PiPePiTo