Monade in JavaScript

1

Una monade è un oggetto che ha :

  1. A transformation that takes a type and produces a new type. In C# we call such a transformation a "generic type". We have a generic type M<T>, we have a type int, and we produce a new type M<int>.
  2. A generic function unit which accepts a value of type T and produces a value of type M<T>.
  3. A generic function bind which accepts a value of type M<T> and a function from T to M<U>, and produces an M<U>.

Ma come apparirebbe in un linguaggio tipicamente debolmente digitato come JavaScript?

Primo tentativo:

// 1 is not possible because of the typing system?

function monadify(m) {  // 'm' is a function
  if(typeof m !== 'function') {
    throw new TypeError('m must be a function');
  }

  // Returns a function that will apply m to t.
  // "Wraps the value t".
  m.unit = function(t) {  // 2
    return function() { 
      return m(t); 
    };
  };

  // Returns a function that will apply 'm' to 't' and then apply 'fn' to the result.
  // Binds 'fn' to 'm'.
  m.bind = function(m, fn) { 
    return function(t) { // 3
      return fn(m(t));
    };
  };

  return m;
}
    
posta Ben 08.07.2016 - 20:10
fonte

1 risposta

1

Hai ragione che la parte di "tipo costruttore" della definizione (che Eric descrive come una trasformazione di tipo) non è realmente rilevante in un linguaggio tipizzato in modo dinamico. Quindi tutto ciò di cui hai veramente bisogno sono le due funzioni, unit e bind . In Javascript, l'identità monad potrebbe essere simile a questa:

IdentityMonad = {
    unit: function (val) { 
        return {
            bind: function (f) { return f(val); }
        };
    }
};

L'utilizzo di questo aspetto sarebbe simile a:

IdentityMonad.unit(4)
             .bind(function (x) { return IdentityMonad.unit(x+1); })
             .bind(function (x) { window.alert(x); });

Costruire monadi effettivamente utili è lasciato come esercizio al lettore. :)

    
risposta data 08.07.2016 - 20:36
fonte

Leggi altre domande sui tag