[Javascript] Monads

Monads allow you to nest computations. They are a pointed functor that adds mjoin and chain functions to combine other functors. Brian shows a number of code examples of different monads in action.

functions: "mjoin", "chain"

mjoin:

var setSearchInput = function(x){ return ("#input").val(x); }.toIO()
var getSearchTerm = function(){ return getParam("term", location.search) }.toIO()
var initSearchForm = compose(mjoin, map(setSearchInput),  getSearchTerm)

initSearchForm()
//=> IO(Dom)

runIO(initSearchForm())

"getSearchTerm" return an IO, so in "setSearchInput" we need to use map(), but itself will return another IO, so the result is IO(IO()), then we apply mjoin, the result will be "IO()".

chain:

var chain = function(f){
 return compose(mjoin, map(f))
}
var setSearchInput = function(x){ return ("#input").val(x); }.toIO()
var getSearchTerm = function(){ return getParam("term", location.search) }.toIO()
var initSearchForm = compose(chain(setSearchInput),  getSearchTerm)

initSearchForm()
//=> IO(Dom)

runIO(initSearchForm())
var sendToServer = httpGet(‘/upload‘)
var uploadFromFile = compose(chain(sendToServer), chain(readFile), askUser)

uploadFromFile(‘what file?‘).fork(logErr, alertSuccess)
requirejs.config({
  shim: {},
  paths: {
    domReady: ‘https://cdnjs.cloudflare.com/ajax/libs/require-domReady/2.0.1/domReady.min‘,
    ramda: ‘//cdnjs.cloudflare.com/ajax/libs/ramda/0.8.0/ramda.min‘,
    maybe: ‘http://looprecur.com/hostedjs/v2/maybe‘,
    io: ‘http://looprecur.com/hostedjs/v2/io‘,
    future: ‘http://looprecur.com/hostedjs/v2/data.future.umd‘,
    hcjs: ‘http://looprecur.com/hostedjs/v2/hcjs‘
  }
});

require(
  [
    ‘ramda‘,
    ‘maybe‘,
    ‘io‘,
    ‘future‘,
    ‘hcjs‘,
    ‘domReady!‘
  ],
  function (_, Maybe, io, Future) {
    console.clear();

    var runIO = io.runIO;

    // Exercise 1
    // ==========
    // Use safeGet and mjoin or chain to safetly get the street name
    console.log("--------Start exercise 1--------");

    var safeGet = _.curry(function (x, o) {
      return Maybe(o[x]);
    });
    var user = {
      id: 2,
      name: "Albert",
      address: {
        street: {
          number: 22,
          name: ‘Walnut St‘
        }
      }
    };
    function log (x){
      console.log(x.toString());
      return x;
    }

    var ex1 = compose(mjoin, map(safeGet(‘name‘)) ,mjoin, map(safeGet(‘street‘)) ,safeGet(‘address‘));
    var ex1 = compose(chain(safeGet(‘name‘)), chain(safeGet(‘street‘)), safeGet(‘address‘));
    assertEqual(Maybe(‘Walnut St‘), ex1(user));
    console.log("exercise 1...ok!");

    // Exercise 2
    // ==========
    // Use monads to get the href, then purely log it.

    console.log("--------Start exercise 2--------");

    var getHref = function () {
      return location.href;
    }.toIO();
    var pureLog = function (x) {
      console.log(x);
      return x;
    }.toIO();

    var ex2 = compose(chain(pureLog), getHref);

    assertEqual("http://run.jsbin.com/runner", runIO(ex2(null)));
    console.log("exercise 2...ok!");

    // Exercise 3
    // ==========
    // Use monads to first get the Post with getPost(), then pass it‘s id in to getComments().
    console.log("--------Start exercise 3--------");

    var ex3 = compose(chain(compose(getComments ,_.get(‘id‘))) , getPost);
    var ex3 = compose(mjoin, map(compose(getComments, _.get(‘id‘))), getPost)

    ex3(13).fork(log, function (res) {
      assertEqual(2, res.length);
      console.log("exercise 3...ok!");
    });

    // HELPERS
    // =====================

    function getPost(i) {
      return new Future(function (rej, res) {
        setTimeout(function () {
          res({
            id: i,
            title: ‘Love them futures‘
          });
        }, 300);
      });
    }

    function getComments(i) {
      return new Future(function (rej, res) {
        setTimeout(function () {
          res(["This class should be illegal", "Monads are like space burritos"]);
        }, 300);
      });
    }

  });
时间: 2024-08-05 19:45:40

[Javascript] Monads的相关文章

JS函数式编程 3.1 Javascript的函数式库

?? Functional Programming in Javascript 主目录第三章 建立函数式编程环境 Javascript的函数式库 据说所有的函数式程序员都会写自己的函数库,函数式Javascript程序员也不例外. 随着如今开源代码分享平台如GitHab.Bower和NPM的涌现,对这些函数库进行分享.变得及补充变得越来越容易. 现在已经有很多Javascript的函数式变成苦,从小巧的工具集到庞大的模块库都有. 每一个库都宣扬着自己的函数式编程风格.从一本正经的数学风格到灵活松

给 JavaScript 开发者讲讲函数式编程

本文译自:Functional Programming for JavaScript People 和大多数人一样,我在几个月前听到了很多关于函数式编程的东西,不过并没有更深入的了解.于我而言,可能只是一个流行词罢了.从那时起,我开始更深地了解函数式编程并且我觉得应该为那些总能听到它但不知道究竟是什么的新人做一点事情. 谈及函数式编程,你可能会想到它们:Haskell 和 Lisp,以及很多关于哪个更好的讨论.尽管它们都是函数式语言,不过的确有很大的不同,可以说各有各的卖点.在文章的结尾处,我希

玩转 JavaScript 面试:何为函数式编程?

函数式编程在 JavaScript 领域着实已经成为一个热门话题.就在几年前,很多 JavaScript 程序员甚至都不知道啥是函数式编程,但是就在近三年里我看到过的每一个大型应用的代码库中都包含了函数式编程思想的大规模使用. 函数式编程(缩写为 FP)是一种通过组合纯函数来构建软件的过程,避免状态共享.可变数据及副作用的产生.函数式编程是一种声明式编程而不是指令式编程,应用的状态全部流经的是纯函数.与面向对象编程思想形成对比的是,其应用程序的状态通常都是与对象中的方法共享的. 函数式编程是一种

javascript函数式编程简单介绍

函数式编程在前端已经成为了一个热门的话题,近几年很多的应用程序代码库里大量使用着函数式编程思想.这里对JavaSctipt中的函数式编程做一个简单介绍. 什么是函数式编程 函数式编程是一种编程范式,主要是利用函数把运算过程封装起来,通过组合各种函数来计算结果.函数式编程意味着开发者可以在更短的时间内编写具有更少错误的代码. 函数式编程的简单例子 假设要把一个字符串转换成每个单词首字母大写,可以这样来实现: var string = 'i do like yanggb'; var result =

Javascript中call的使用

call 方法应用于:Function 对象调用一个对象的一个方法,以另一个对象替换当前对象.call([thisObj[,arg1[, arg2[,   [,.argN]]]]])参数:thisObj 可选项.将被用作当前对象的对象. arg1, arg2, , argN 可选项.将被传递方法参数序列. 说明:call 方法可以用来代替另一个对象调用一个方法.call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象.如果没有提供 thisObj 参数,那么 G

你不知道的javascript 之 >>

?远大于符号 在数学公式中,">>"代表远大于符号,表示一个数远大于另一个数,如76>>3,-2>>-99等.庞加莱与波莱尔1901年首先使用了它,很快被数学界所接受,沿用至今. 折叠编辑本段右移运算符 在许多计算机编程语言(例如:C语言.C++语言.Java语言.JavaScript语言.Pascal语言等)中,">>"代表右移运算符,就相当于"shr".该运算符为双目运算符,结合方向为从左到右,

初识JavaScript

JavaScript简介 JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能.因为JavaScript兼容于ECMA标准,因此也称为ECMAScript. ECMAScript,描述了该语javascript组成言的语法和基本对象. 文档对象模型(DOM),描述处理网页内容的方法

最全解析如何正确学习JavaScript指南,必看!

划重点 鉴于时不时,有同学私信问我:怎么学前端的问题.这里统一回复一下,如下次再遇到问我此问题同学,就直接把本文链接地址发给你了. "前端怎么学"应该因人而异,别人的方法未必适合自己.就说说我的学习方法吧:我把大部分时间放在学习js上了.因为这个js的学习曲线,先平后陡.项目实践和练习啥的,我不说了,主要说下工作之外的时间利用问题.我是怎么学的呢,看书,分析源码.个人这几天统计了一下,前端书籍目前看了50多本吧,大部分都是js的.市面上的书基本,差不多都看过. 第一个问题:看书有啥好处

JavaScript数据类型检测

一.JavaScript 数据类型 1.基本数据类型(6种) Undefined Null Boolean Number String Symbol (ES6新增) 2.引用数据类型: Object 二.数据类型检测 1. typeof 可以检测除null 外的基本类型.null 和所有对象的typeof都是"object", 不能用于检测用户自定义类型. 比如Date, RegExp, Array, DOM Element的类型都是"object". var s