2011-12-28 24 views
11

¿Cómo se vería un código JavaScript de ejemplo que utiliza Monad? Lo estoy preguntando porque la comprensión de Monad es mucho más clara si puedo ver un ejemplo de código (y el hecho de que JavaScript sea un lenguaje simple y funcional podría ser el mejor lenguaje para usarlo para aprenderlo).Mónadas en JavaScript?

+0

Cuéntanos algo sobre Monad, ¿cómo se diferencia de javascript? –

+1

@Umesh - http://en.wikipedia.org/wiki/Monad_(functional_programming) –

+2

JQuery es más o menos una mónada en js. –

Respuesta

18

Comenzaría escribiendo su propia mónada en JavaScript. La lista de mónadas es un gran lugar para comenzar; Lo encuentro de lejos el más útil. Simplemente defina funciones que hagan lo siguiente:

  1. Cree una lista de un artículo dado (llame a este mreturn).
  2. Cree una lista vacía (llame a este mzero).
  3. Agregue una lista a otra (llame a este mplus).
  4. Aplicar una función para transformar cada elemento en una lista dada (llame a este map).
  5. "Aplanar" una lista de listas en una lista simple concatenando las listas (llame a este join).

Esto define lo que se conoce como una "mónada aditivo" (mzero y mplus formar la parte "aditivo"). Juega para ver qué cosas interesantes puedes hacer usando solo estas funciones para operar en listas. Por ejemplo, se puede calcular la lista de todos los números pares en la tabla de multiplicar del schoolkid así:

var nums = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]; 
var even_products = join(map(join(map(nums, function (x) { 
     return map(nums, function(y) { return x * y }) 
    })), 
    function (x) { if (x % 2 == 0) { return mreturn(x) } else { return mzero() } } 
)); 

Alternativamente, se combinan map y join juntos como una sola función definida como function bind(l, f) { return join(map(l, f)) }. bind se puede utilizar en lugar de map y join y se utiliza con más frecuencia en, p. Haskell. El mismo ejercicio anterior, entonces puede ser escrita:

var nums = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]; 
var even_products = bind(
    bind(nums, function (x) { 
     return bind(nums, function (y) { return mreturn(x * y) }) 
    }), 
    function (x) { if (x % 2 == 0) { return mreturn(x) } else { return mzero() } } 
); 

Por último, es posible que desee incorporar estas funciones como parte de un nuevo prototipo de la lista (o lo que sea JavaScript tiene que transcurre para las clases en estos días), por lo que en su lugar puede escribir el jQuery-esque:

var nums = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]; 
var even_products = nums 
    .bind(function (x) { return nums.bind(function (y) { return mreturn(x * y) }) }) 
    .bind(function (x) { if (x % 2 == 0) { return mreturn(x) } else { return mzero() } }); 
Cuestiones relacionadas