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

ItNaS

#90 cual era la que era lenta en tu caso?

en TweetSet tenía estas:

def union(that: TweetSet): TweetSet =
  if (that.isEmpty) this
  else this.incl(that.head).union(that.tail)

  // Hint: the method "remove" on TweetSet will be very useful.
def ascendingByRetweet: Trending =
  if (this.isEmpty) new EmptyTrending
  else {
    val tweetMin = this.findMin
    new NonEmptyTrending(tweetMin, this.remove(tweetMin).ascendingByRetweet)
  }

en NonEmpty esta

def filter0(p: Tweet => Boolean, accu: TweetSet): TweetSet =
  if (p(this.head)) this.tail.filter0(p, accu.incl(this.head))
  else this.tail.filter0(p, accu)

y en empty simplemente

def filter0(p: Tweet => Boolean, accu: TweetSet): TweetSet = accu
1 respuesta
B

#91: No recuerdo :S Y lo tengo más o menos igual como tu.

#93: Guay, aunque las pasé putísimas para el último assigment, tiemblo con el de esta semana. El nivel me supera ya...

#94: El 6 o el 7? Yo aún no empecé el 7. A mí el 6 me pareció jodido sí, pero básicamente porque no tengo rodaje ninguno, es normal.

2 respuestas
16 días después
ItNaS

#92 Como va eso?, yo estoy con el último assignment. Me ha gustado mucho el curso.

1 respuesta
ItNaS

este ultimo era chunguete, si necesitáis alguna ayudita os intento dar las pistas justas.

#92 el 6 xd. con el 7 me pondre este finde

1 respuesta
25 días después
eisenfaust

bump

1 respuesta
elkaoD

#95 :)

Es una pena que la comunidad no sea tan activa como con Node. Mucha falta de bibliotecas que ayuden con Clj+Cljs, los frameworks HTTP tienen MUCHO que envidiar a Express... y el paso previo de compilación es una cacufla total (nada de en vivo como con Node.js + Coffee por ejemplo.)

Por no hablar de que aún no he tocado un framework de eventos a la Node decente en Clj.

3 1 respuesta
2 meses después
Tryptamine

Tengo una entrevista con una empresa de San Francisco, quieren devs Scala. Ya les he dicho que sólo he hecho lo de Coursera pero que controlo Haskell. Al parecer sólo quieren filtrar devs mediocres xD

Ya os contaré lo que pasa.

1 1 respuesta
B

#97: Cómo has conseguido esa entrevista? xD

#99: Lol? xDDD Pasa foro si eso, que no conozco ninguno de habla inglesa decente.

1 respuesta
Tryptamine

#98 Haciendo comentarios sarcásticos en un foro de desarrollo cuando debería estar trabajando xD

1 respuesta
C

#96 ya podías currarte algo introductorio a node.js o redis
Habrá mil tutoriales por ahí, pero estaría bien qcuando termines los exámenes hicieras algo para mvdev.

1 respuesta
elkaoD

#100 sólo para ti (doy la introducción a JS por conocida :P):

Introducción rápida a Node.JS

Para empezar no hay mucho más que hacer que instalar el último binario de http://nodejs.org/ (o de tu package manager favorito si estás en Linux, aunque suelen tener builds viejas). El binario de Node viene con NPM, una utilidad de manejo de paquetes propia.

Para ejecutar tanto Node como NPM hay que tirar de consola. Obviamente recomiendo un buen resaltado de sintaxis para tu editor favorito (cualquiera de JS vale). Ejecutando node se abrirá el REPL o intérprete interactivo. node archivo.js ejecuta el archivo indicado.

NPM

NPM es el gestor de paquetes de Node. Los proyectos en Node.JS vienen acompañados de un archivo package.json (doc, ejemplo) en el que declaran, entre otras cosas, las dependencias necesarias. Con un simple npm install dentro de cualquier proyecto Node se descargarán e instalarán automáticamente las dependencias listadas.

Para instalar un paquete a mano, npm install nombrepaquete (se instalará sólo para la carpeta/proyecto actual).

Para instalar un paquete globalmente, npm install -g nombrepaquete (necesario privilegios de root/administrador). Por ejemplo, tras instalar CoffeeScript con npm install -g coffee-script se pueden ejecutar archivos .coffee con coffee archivo.coffee en cualquier carpeta del sistema.

require

Node añade muy poco sobre el JavaScript básico que ofrece V8 (el engine JS de Google Chrome). Además de la API básica que viene con Node (api docs), se añade una función global require para cargar paquetes (una especie de #include de C o import de Java/Python). La principal diferencia es que require cachea los accesos por lo que varios require en la misma ejecución cargarán la misma referencia de paquete (y por tanto, sólo se ejecutará el código global de paquete una vez).

Una vez instalado el paquete ejemplo desde NPM, cargarlo es tan fácil como var example = require('ejemplo');. El paquete ejemplo estará disponible en la variable example y se podrá usar como example.propiedad = ...;

require también admite rutas relativas que te permiten dividir en módulos tu paquete, como por ejemplo require('./modulo'); para cargar el archivo modulo.js de la carpeta actual.

Callbacks

La filosofía de Node se basa en que, siendo este un proceso de un sólo hilo, el proceso (la CPU) debe estar el mínimo tiempo ocupado por el programa para así poder atender más peticiones. Node sólo puede estar ejecutando un código en paralelo (no dispone de hilos) por lo que sólo habrá una petición ejecutándose en CPU al mismo tiempo (a no ser que se lancen varios procesos de Node, independientes unos de otros).

Esto lo hace ideal para programas intensivos en entrada/salida como servidores, donde la CPU no queda bloqueada mucho (debe ser rápida en servir) lo que en teoría beneficia la escalabilidad, aunque por contra lo hace horrible para procesos intensivos en CPU.

¿Cómo funciona entonces Node? ¿Cómo se consigue que los programas no se bloquéen? Node.js añade al modelo de ejecución de JavaScript un sistema de eventos. El modelo de ejecución es algo así:

1. Ejecutar código JS
2. ¿Hay algún listener a la escucha de eventos? FALSE = finalizar programa
3. ¿Hay algún evento a la escucha? TRUE = despachar UN evento en espera
4. Goto 2

Por lo tanto la manera básica de trabajar en Node es asociando listeners a eventos (patrón observador de toda la vida) y así funcionarán el 99% de funciones (salvo que se indique lo contrario): "cuando me llegue una petición HTTP a /index.html haz X", "cuando me llegue una petición HTTP a /room.html haz Y". Tú defines unos eventos y una función (o callback) que será llamada cuando un evento se dispare.

En el JS de nuestros navegadores seguro que más de uno lo ha usado sin saberlo:

setInterval(function() {
  console.log("¡Callback llamado!");
}, 3000);

Como ejemplo básico, vamos a usar la función readdir del paquete fs para leer los ficheros en un directorio. Entrando en la documentación de fs.readdir vemos que acepta dos argumentos: la ruta y un callback (una función) con los argumentos (err, files).

PROTIP: todos los callbacks que pueden resultar en un error recibirán como primer argumento err que será undefined/null/false si no hay error u otro si ha habido error (usualmente un string con la explicación del error).

var fs = require('fs'); // Cargamos el módulo FS

fs.readdir('./', function(err, files) {
  // El readdir ha terminado, estamos dentro del callback
  if (err) {
    console.log('Error: ' + err);
    return; // Error, salgamos del callback
  }
  console.log('Archivos: ' + files);
});

console.log('Hello files!');

Este programa, una vez ejecutado, imprimirá (si no hay error):

Hello files!
Archivos: ejemplo.js, etc.

¿¡WTF!? ¡Si el console.log de "Hello files!" está DESPUÉS del listado de archivos! En efecto, como comentaba antes, node es por defecto asíncrono/non-blocking, por lo que llamar a fs.readdir no ejecutará el código de forma instantánea, sino que continuará la ejecución normalmente y, cuando el directorio haya sido leído completamente se lanzará el evento y, una vez disparado este, se llamará al callback correspondiente.

PROTIP: los callbacks no tienen por qué ser anónimos, se podría haber hecho:

function callback(err, files) {
  if (err) {
    console.log('Error: ' + err);
    return; // Error, salgamos del callback
  }
  console.log('Archivos: ' + files);
};

fs.readdir('./', callback);

o

var callback = function(err, files) {
  if (err) {
    console.log('Error: ' + err);
    return; // Error, salgamos del callback
  }
  console.log('Archivos: ' + files);
};

fs.readdir('./', callback);

Práctica que, de hecho, es recomendable cuando se empieza a enmarañar el código.

Servidor HTTP

Como código de ejemplo el típico servidor HTTP simplote:

var http = require('http');

var HOST = '127.0.0.1';
var PORT = 1337;

var server = http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
});

server.listen(PORT, HOST);
console.log('Server running at http://' + HOST+ ':' + PORT+ '/');

Ejecutar en Node y acceder a http://127.0.0.1:1337 (o el HOST/PORT indicado). Así de sencillo.

Enlaces

Naaaaah, ¡usad Google!

7 1 respuesta
C

#100 te ha faltado aquello de los libros en cursiva al final del prefacio:

dedicado a mis nerds: ...

Thx! Por lo menos me ha qdado claro qse basa en el patrón observador y cómo montarlo para empezar a trastear.

eisenfaust

#101 (lol, 101 en un post de Node 101).

Que haceis hablando de cosas utiles en un hilo de FP? Ni siquiera has mencionado LiveScript ni Roy.

2
G

Buenas a todos

Soy Estudiante de Ingenieria de Telecomunicaciones y estoy actualmente desarrollando mi Proyecto Final de Carrera.
Estoy realizando el mismo con el uso del programa SCALA y ando algo perdido respecto a ciertos temas. Me gustaría saber si hay alguien por aqui que conozca el programa y me pueda hechar una mano. Sobretodo es con tema de base de datos y poco mas, nada complicado.

Muchas gracias y agradezco cualquier ayuda.

Saludos
Agustin Quevedo
[email protected]

1 respuesta
elkaoD

#104 hola Agustín. Te animo a que publiques las dudas en abierto en este mismo (u otro) hilo y así podremos echarte un cable entre todos. Es raro que alguien te vaya a dar su correo para resolverte dudas personalmente (la gente cobra por ello :P)

Un saludo.

G

Bueno, pues comento, a ver quien puede exarme una mano...(disculpas si me enrollo).

El proyecto fin de carrera consiste en dotar a una tienda una pantalla tactil con todos los productos de una marca deportiva. Sitúate tu como cliente, entras en la tienda y ves la pantalla tactil. Desde ella puedes ir accediendo a diversos menús (ropa, calzado, material,...) hasta llegar al producto que has buscado (imagínate: Calzado // deportivas running // modelo J042) has encontrado tu modelo y lo consultas para ver materiales, foto etc...
Lo que me interesa es crear una hoja interna que vaya anotando aquellas referencias que van siendo vistas, de tal forma que al final del día pueda yo saber qué productos son los mas vistos por los usuarios.
Osea una lista con TODAS las referencias de la marca y un contador que vaya subiendo conforme vaya entrando en determinadas referencias.

No se si queda explicada una de mis primeras dudas.

elkaoD gracias, a ver si alguien se porta... jeje

2 respuestas
elkaoD

#106 eso suena más a tema de BD que de Scala.

eXtreM3

#106 si pretendes hacer después estadísticas por día, semana, mes... tendrás que tener una tabla aparte que guarde: idProducto y fecha/hora de visita.

1 respuesta
elkaoD

#108 ojo, vino de Google y yo creo que Scala mis cojones xD

http://www.mediavida.com/foro/9/scala-designer-470856

1 respuesta
eXtreM3

#109 wtf xd

G

buenassss, el tema es que yo me referia al programa SCALA DESIGNER y no al lenguaje de programación SCALA..desde un ppio me expliqué mal... sorry :(

disculpen el malentendido

22 días después
elkaoD

Me lo acaba de pasar eisen por IRC, wat total:

Es una mezcla entre ridículo y acertado.

3
ItNaS

vi a un compañero con este libro en la mesa. le he de echar un vistazo xd.

eisenfaust

"Erlang Shen (二郎神), or Erlang is a Chinese God with a third truth-seeing eye in the middle of his forehead."

http://en.wikipedia.org/wiki/Erlang_Shen

Esto empieza oficialmente a dar miedo.

Para el que no lo pille:

http://www.erlang.org/ http://shenlanguage.org/

18 días después
eisenfaust

Un texto que esta pegando bastante, la vision de un hipster sobre Clojure en cuanto a si esta ready para el prime time or not: http://wit.io/posts/clojure-all-grown-up

No es gran cosa pero si eres un PiradoIV de la vida lo encontraras convincente xD

1 respuesta
elkaoD

#115 pues sería un fichaje crema Pirado para la secta. Ya le he pervertido con Coffee, Jade y Stylus. De ahí al funcional puro hay un paso.

1 respuesta
eisenfaust

#116 CafetasoScript.

19 días después
eisenfaust

http://clochure.org/ xDDD

Some of the advantages of Clochure over Clojure are:

  • Easier to read, compare: (+ (expt 2 30) 2) with [+ [expt 2 30] 2].
  • It compiles faster, since the compiler don't need to differentiate Java parentheses from Clojure ones.
  • You can find thousands of iOS developers that can jump right on to Clochure Projects.
  • The [] keys are closer to the central row of your keyboard than the less comfortable ().
  • You don't need to hold the shift key to type [] therefore you can code faster.

Llego un dia tarde, pero SOLD xD

3
28 días después
elkaoD

BODOL

BODOL es un lenguaje/experimento funcional inspirado en Clojure, Shen, Haskell... bajo licencia Apache (fuck you Shen). Work in progress. Objetivos preliminares (que podrían o no cumplirse):

  • Lenguaje funcional puro.

  • Homoiconicidad a lo Lisp.

  • Primitivas tradicionales de Lisp.

  • Tipado estilo Hindley-Milner (Haskell).

  • Currificación.

  • Pattern matching.

[IGNORAR] Esto está aquí porque el [code] de MV está buggeado.

Hola mundo del mundo funcional:

(ƒ factorial
  0 -> 1
  n -> (* n (factorial (- n 1))))
(ƒ fibonacci
  0 -> 0
  1 -> 1
  n -> (+ (fibonacci (- n 1)) (fibonacci (- n 2))))

Pattern matching avanzado:

(ƒ map
   f () -> ()
   f (head . tail) -> (cons (f head) (map f tail)))

(= '(2 3 4) (map (λ a -> (+ a 1)) '(1 2 3))))

Currying:

(ƒ triplet a b c -> (list a b c))
(define one-and (triplet 1))
(define one-and-two-and (one-and 2))
(= '(1 2 3) (one-and-two-and 3))
1 1 respuesta
eisenfaust

#119 related: Growing a Language with Clojure and Instaparse

1