Programación funcional (Scala, Clojure, etc.)

B

Solo un recordatorio: mañana empieza el curso de Scala. Ya comentaré impresiones desde el punto de vista de un novato tanto de PF como Scala.

#62: Yo la verdad lo que tengo en mente es Erlang porque se usa en una empresa de por aquí en la que pagan muy bien, y sé que si hubiera sabido un mínimo, hubiera entrado :\

Me espera esto en Octubre: http://erlangcamp.com/

A ver er_Paper

1 respuesta
eisenfaust

#61 Ya nos contaras xD

Yo ando pegandome haciendo un subset de Perl en Haskell (con parsec, eso si) y creo que hacia a'os que no le gritaba tanto a una terminal xD

Te dejo un paper fresco que seguro que te interesa:

Haskell vs. F# vs. Scala: A High-level Language Features and Parallelism Support Comparison

http://www.macs.hw.ac.uk/dsg/gph/papers/pdf/fhpc12.pdf

2 respuestas
B

Bueno, de momento solo he visto la primera lección (hay 5 esta semana). Unos 13 minutos de introducción básica. Los "deberes" parecen sencillos y pocos de momento.

Los vídeos online no van (o al menos a mí no), pero te los puedes bajar (junto con las transparencias). Eso sí, vienen sin subs (al tío se le entiende muy bien).

De momento guay, a la noche veré un par de lecciones más y me meteré con las tareas a ver qué tal.

EDIT:

Las lecciones son sencillitas. Ejercicios hay tres, dos muuuy fáciles y el último con algo de chicha, pero lo dejo para mañana. Un saludo!

BLZKZ

A ver si me pongo mañana xD

B

Están todos hechos. Realmente el último no era tan difícil si has dado un poco de algoritmos.

#66 Si quieres pistas avisa

1 respuesta
soulsville

Yo ni doy hecho el 1º. Puto retraso mental.

#65 Me acaba de salir. La recursividad me cuesta, no tengo puta idea. Era sencillo, tenías razón.

A por el segundo, a ver.

#67 Dos cosas:

  • no entiendo el puto programa. El recfun que te bajas no sé qué pinta si no lo puedo ni ejecutar. Lo que hecho es crearme un recfun.scala application y añadirle el código del main y la función.
    ¿Cómo empleo el código del 'test' para el balance? Porque me he creado un balance.scala application y no veo la forma.

  • ¿una pista para el balance?

tengo algo así:

  • si la lista está vacía, true
  • si el primer carácter es ( , llamo a la función y le paso el resto de la lista.
  • si el primer carácter es ), true.
  • si no es lo anterior, false.

Obviamente no tiene ni pies ni cabeza.

Entiendo que los casos base son la lista vacía y cuando termino, ¿no? No sé, estoy liadísimo, joder.

#69 ¿Para el cambio de monedas has utilizado una innerfunction? Es que leyendo por el foro veo que se puede solucionar sin emplear nada más que el empty, head y tail.

3 respuestas
B

Una pregunta, sobre todo a #62 y a #61.

A mí la programación funcional me parece un campo muy interesante porque, bajo mi punto de vista, requiere de mayor habilidad. Además sé que es utilizada en muchos casos, para computación de altas prestaciones (la mayoría tienen un paralelismo brutal, si mis informaciones son correctas).

Si embargo, podríais plantearme un ejemplo real (no es necesario que sea muy grande), donde podría utilizarse?

Cómo se afrota una arquitectura C/S con funcional? Scala es funcional pero incorpora OO, de qué sirve la OO sin estado?

Gracias bros.

#66: Si te bajas el recfun, vas a la carpeta y haces "sbt test", ya te corre los tests. Tienes las instrucciones en el curso.

Yo el del balance lo hice así (posiblemente sea una aberración en PF, pero no he trabajado con ella más de 4 o 5 horas en mi vida de momento xD): http://pastebin.com/9Te8sWFW

1 2 respuestas
elkaoD

#67

No es que la programación funcional tenga un paralelismo brutal, sino que el estado inmutable es inherentemente paralelizable a gran escala (por eso Scala escala :P), dado que no hay efectos colaterales y por tanto te da igual ejecutar cierto algortimo paralelizable sobre 1 que sobre 100000000 de computadoras.

Un ejemplo típico: "map" sobre un array es paralelizable si la función que mapea está libre de side-effects, por lo que cuanto más elementos de computación (cores, clústers, da igual.) Cuantos más elementos paralelizables tengas, más rápido irá el map sobre ese array, siendo el cuello de botella el hardware y en ningún momento el software.

Si embargo, podríais plantearme un ejemplo real (no es necesario que sea muy grande), donde podría utilizarse?
Shaders OpenGL (cada pixel es independiente del estado intermedio del resto), cálculo de físicas (un fotograma es estático), algortimo del viajante, etc. De hecho uno de mis deseos más húmedos es un compilador Lisp->GLSL (y había algún proyectillo por ahí.)

Cómo se afrota una arquitectura C/S con funcional?
Igual que con cualquier otro paradigma. Obviamente hay side-effects, si no no podrías comunicarte con el mundo exterior (cualquier tipo de I/O es un efecto colateral.)

Scala es funcional pero incorpora OO, de qué sirve la OO sin estado?
Incorrecto, la PF no es que no tenga estado, es que este es inmutable (preferentemente.)

1 respuesta
B

#68: Vale, me colé con lo del estado, efectivamente.

Todo esto que me has dicho es un poco lo que pensaba, pero por lo que veo la auténtica utilidad de la PF es sobre algoritmos avanzados. Quiero decir que no tiene mucho sentido molestarse en hacerte un gestor de series en funcional, por ejemplo.

#70: Bien, bien. Me queda claro. Como estoy acostumbrado a imperativa, realmente a mí me cuesta más entender la funcional (sobre todo los algoritmos, con tanta recursividad). Eso sí, es mucho más divertido.

2 respuestas
elkaoD

#69 eso sólo si te quedas con ESA ventaja del funcional, pero no es la única.

A mí me parece que la gran ventaja de la programación funcional es su expresividad y lo fácil que es seguir el flujo de un programa (es más fácil razonar sobre la ejecución de un programa sin side-effects y cuyo orden de ejecución no importa.)

También es más fácil de testear por la misma razón.

En #1 tienes mi postura ampliada :)

#69 a mí cada vez me cuesta más pensar en imperativa, y eso que es lo que uso en el curro. En cuanto tengo la oportunidad planto filters, maps y demás y me quedo tan agusto :P

Ya te digo que no es tan diferente, lo que tienes es que abstraerte del concepto.

La recursividad se usa hasta cierto punto. Normalmente se usan más funciones de más alto orden (higher-order functions) que te abstraen toda la lógica de "reptición" y tú sólo debes pensar en el "qué" y no el "cómo". Si usas bucles o recursividad, sospecha de tu código :P

2 respuestas
B

#66: No lo he hecho solo con eso que comentas. Pero es difícil si no has dado algoritmos (bueno, a mí no se me ocurrió facilmente, y tuve que consultarlo).

#70: Gracias ;)

#72: La mía también es así :P. Reconozco que no llegué a la solución por mí mismo. Lo intenté durante una hora, dándole vueltas a la cabeza. Al final lo busqué y lo entendí perfectamente.

Eso es lo que pasa cuando en tu rama no das ni Algoritmos ni P. Funcional. Qué asco de carrera hice, por suerte existen libracos para compensar esas carencias.

#73: Los tengo apuntados ya, pero gracias ;). De momento estoy leyéndome (y haciendo los ejercicios) este en mi tiempo libre.

2 respuestas
soulsville

Joder, por fin me salió el 3. Me traía de cabeza.
Lo cierto es que las tareas (el 3 especialmente) me han costado más de lo que pensé en un principio. No imaginé que pudiese costar tanto cambiar de forma de pensar a la hora de programar. Es difícil dejar de lado las 'manías' del imperativo.

#71 Te pongo el código, por si quieres ver una forma distinta a la tuya (supongo):

http://pastebin.com/LHSFA7xt

1 respuesta
MTX_Anubis

#71 Ya que estamos con coursera y si te interesa (el primero ya acabó pero puedes acceder al preview):

https://www.coursera.org/course/algo
https://www.coursera.org/course/algo2

1 respuesta
ItNaS
B

Estoy con los ejercicios de esta semana, muy divertidos (definicion de conjuntos y sus operaciones, sencillito). Las lecciones un poco espesas, pero muy importantes.

PD: Vale, la PF es Dios². Me he enamorado.

PD2: Soy retard, no me sale el map para sets. :ninjaedit:

PD3: OK, qué fácil es cuando piensas en funcional (y no traduciendo de imperativo).

map(S,f) = {b | ∃c ∈ S, f(c)=b}
1
eisenfaust

Parece ser que el notas de Odersky se esta limitando a traducir SICP a Scala asi que pasando.

Esto tiene mejor pinta, es del autor de Real World Haskell: http://www.scs.stanford.edu/11au-cs240h/

B

Qué tal los de esta semana?

Aún tuve que darle vueltas y de hecho no me hace gracia la solución al primero que tengo (no uso el acumulador, me da que no es óptima).

Además, no acabo de entender bien el último (lo saqué pero probando cosas, al más puro estilo del software esforzado xD). Tengo que acostumbrar mi mente a programar de esta forma.

1 respuesta
B

Buenas chavales, posteando desde el ErlangCamp 2012, a ver si el listening no me juega malas pasadas.

#79: http://erlangcamp.com/

Bases de Erlang + OTP (que es lo que realmente mola). De momento no hay comida xDDD

PD: A la noche hablamos del tema de scala.

1 1 respuesta
elkaoD

#77 estoy en el curro así que la respuesta es mirando MUY por encima tu comment (luego la reviso en casa) pero... ¿"pattern matching" quizá?

#78 qué es ErlangCamp y por qué estás allí? ¿Hay mini-perritos-calientes? xD

2 respuestas
B

#79: En el curso no nos dan nada de pattern matching y se supone que hay que hacerlo solo con lo que te dan (un acumulador en la llamada a la funcion y el hecho de ver el arbol como un nodo hoja o como un nodo con dos subárboles).

Sobre el ErlangCamp, empezaron con las bases de erlang (que ya sabía) y después se pasaron ya a arquitecturas básicas de OTP que a mí personalmente me dejaron con cara de gilipollas. Es la primera vez que voy a un curso-taller práctico y no lo pillo bien. A ver si saco fuerzas a la noche para darle un repaso.

Uno de los ponentes es co-autor del libro este de Erlang & OTP in Action o algo así.

1 respuesta
elkaoD

#80 con pattern matching lo que planteas es sencillísimo pero si dices que ni lo conocéis pues nada xD

Como tú apuntas, hay que meterlo al acumulador. ¿Puedes enlazar el ejercicio o algo? Es que no sé qué es "this" ni "Tweet" ni "TweetSet" xD

No veo que estés recorriendo el árbol, así que me imagino que no está bien la solución, a no ser que "filter0" sea un helper.

#80 básicamente tienes que sumar al acumulador el resultado de hacer filter a sus dos subárboles, ¿no? Con eso + usar los métodos que te proporcionan creo que sobra.

B

#83: Gracias ;)

1 respuesta
elkaoD

#82 prueba con:

right.filter0(p, left.filter0(p, (p(elem) && accu incl elem) || accu))

Aunque la versión de varias líneas me parece más "readable".

1 1 respuesta
B

Bueno, finalizado ya el ErlangCamp. Es la primera vez que salgo abrumado de un curso intensivo, pero bueno también era el primero al que iba en inglés y todo ayuda.

Eso sí, tocamos cosas bastante molonas la verdad. OTP es cool.

forlayo

ERLANG! xD

B

He eliminado trozos de código, el staff del curso se acaba de rallar con que hay peña compartiendo soluciones y se están cagando en Dios xD

1 1 respuesta
soulsville

Últimamente tengo muy poco tiempo para el curso, así que veo difícil la entrega de la semana anterior. Intentaré mirarlos el jueves, a ver.

eisenfaust

Google Common Lisp Style Guide https://google-styleguide.googlecode.com/svn/trunk/lispguide.xml

Agree en casi todo. Tienen cosillas que ademas aplican a otros lenguajes por lo que no viene mal echarle una lectura.

ItNaS

Me está gustando mucho esto de la programación funcional. En el tercer assignment no me dio por bueno la ultima parte del código pero bueno, la de GoogleVsApple, Solo estamos #86 y yo en el curso?

1 respuesta
B

#89: Timeout? Eso es que alguna de las funciones que implementaste es muy lenta. A mí me pasó también, estuve bastante tiempo para sacar el 10.00.

Y con el 4 igual, este me costó un pelín más.

1 respuesta