Semana 1 Funciones y asignaciones - Principios de programación funcional en Scala

Saludos.

Acá les va una reseña de la primera semana del curso.

El curso funciona así:

Hay videos y hay asignaciones que se califican automáticamente. No es un curso de Scala, ya debes de saber al menos lo básico.

En los videos Martin Odersky va explicando los conceptos de la programación funcional. Los videos son de 6-10 minutos, muy fáciles de seguir.

En las asignaciones, una por semana, descargas el código que viene con pruebas unitarias y hay que implementar la funcionalidad que es calificada automáticamente cuando la envías. Esto es genial, porque en vez de estar escribiendo cosas que no vienen al caso ( como capturar la información desde la pantalla ) te hace enfocarte en el problema, además que te da retroalimentación sobre tu código!

Ejemplo del ejercicio que viene de calentamiento se pide encontrar la sumatoria de una lista:

 def sum(xs: List[Int]): Int = ???

Y las pruebas son

sum(List(1,2,0)) == 3

Cuando se resuelve el código lo envias usando la herramienta de construcción de Scala: sbt. Supongo que siendo los creadores pudieron fácilmente conectarla a cursera o algo porque basta con escribir:

submit tu @email.com unPasswordXyz

Y tu asignación es envíada y después de un tiempo calificada automáticamente. 80% si pasa los test y 20% si tiene buen estilo. Siendo este un curso de programación funcional, se desalienta el uso de loops ( for, while, etc. ) y viene retroalimentación, por ejemplo en mi primer envio me dijo esto:

======== CODING STYLE ISSUES ========

Checking file /home/ubuntu/progfun2/submission/src/main/scala/common/package.scala... OK!
Checking file /home/ubuntu/progfun2/submission/src/main/scala/example/Lists.scala...
  1. warning at line 41 character 90:
     Avoid using return

Puedes corregir la observación y volverlo a enviar cuantas veces quieras.

Lo que aprendí en esta semana:

1. Que se puede no usar return en Scala :P
2. Paso de parametros por nombre ej. def funcion( a : Int, b : => Int ) : Int ( b se pasa por nombre, no por valor, si no se usa nunca se evalúa )
3. Conceptos fundamentales que ya sabía por mi cuenta pero los tenía todos alrevesados ( como porque el estilo funcional es conveniente en un ambiente multi-procesador )
4. Y ya.

Aún me faltan algunos videos, pero pude enviar mi asignación a tiempo. El útlimo ejercicio ( cambio de dinero ) me costó un buen de trabajo.

Afortunadamente en la escuela aprendí bien a usar la recursividad ( ya estoy algo oxidado claro ) pero aún me acuerdo.

La solución recursiva por ejemplo al problema de arriba es:

def sum(xs: List[Int]): Int = if ( xs.isEmpty ) 0 else xs.head + sum( xs.tail )

Me gusta como todo es una expresión ( no hay necesidad del return ) aunque esta medio raro al principio.

Ahí les voy contando otras cosas cuando las aprenda.

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 ezamudio

return en Scala

No sólo se puede no usar; se desalienta su uso. Un return en Scala se convierte en un break y hace todo un desmadre en el bytecode generado, es bastante ineficiente.

jaja con razón te ponen

jaja con razón te ponen puntos malos ..

Uy pues que chafa no?

Imagen de Cid

Buen punto para ver que se aprendio en el curso de Scala

Que bien, yo no había pensado en poner un return pero cuando realice la tarea 2 que la hice mal si pense ponerlo pero me marcaba algunos errores pero no creo que fuera por la palabra si no porque no estaba devolviendo lo que debia me pedia Unit y yo regresaba un List[Char] pero es bueno saber que el uso de return no es conveniente, pero mi pregunta es la siguiente y porque sigue como palabra reservada ? algún motivo en espeical ?

Imagen de ezamudio

para casos extremos

Por si de plano necesitas usar return, ahí lo tienes. Pero se supone que es como un antipatrón en Scala. Seguramente bferro nos podrían explicar mejor.

Imagen de echan

Cool

de aqui a funciones de alto orden:

  def sum(xs: List[Int]): Int = if ( xs.isEmpty ) 0 else xs.head + sum( xs.tail )
  def mul(xs: List[Int]): Int = if ( xs.isEmpty ) 0 else xs.head * sum( xs.tail )
 
  def operacion(f: List[Int] => Int, l:List[Int]):Int = f(l)

 
 operacion( sum, List(1,2,3)  )
 operacion( mul, List(1,2 3)  )

esperamos más avances para los que no pudimos inscribirnos

Yeap, esa es la segunda

Yeap, esa es la segunda asignación.

Otra cosa que aprendí es que debo de ver todos los videos antes de hacer los ejericios :P Precisamente me estaba quebrando la cabeza con algo que explicaron en un video que no había visto ::)