zoukankan      html  css  js  c++  java
  • [Functional Programming] Function modelling -- 10. Free Monads

    Path: Compose Functors -> Monad Transformers -> Free Monad

    Free monads, it provides a way to modelling functions as Data type. So composing / chaining data types to form the application.

    We also need something called `interpret` which can automaticlly do partten matching and do actual tasks.

    Read more: https://medium.com/@drboolean/free-er-monads-in-js-f5a59e7abc82

    https://medium.com/@drboolean/free-er-monads-in-js-pt2-8ab3b9efa510

    So, part one, how to modelling function as data type:

    const { liftF } = require("../free");
    const { Id } = require("../types");
    const { taggedSum } = require("daggy");
    
    const Http = taggedSum("Http", {
      Get: ["url"],
      Post: ["url", "body"],
    });
    
    // Free Http Get
    const httpGet = (url) => liftF(Http.Get(url));
    // Free Http Post
    const httpPost = (url, body) => liftF(Http.Post(url, body));

    Using 'daggy' to build Http object.

    So if you call:

    Http.Get('/home') // {url: '/home'}

    Then compose to an application:

    const app = () =>
      httpGet("/home").chain((contents) => httpPost("/analytics", contents));
    
    const res = app().foldMap(interpret, Id.of);

    Last thing is the 'interpret':

    const interpret = (x) =>
      x.cata({
        Get: (url) => Id.of(`contents for ${url}`),
        Post: (url, body) => Id.of(`Post ${body} to ${url}`),
      });

    --

    Full code:

    const { liftF } = require("../free");
    const { Id } = require("../types");
    const { taggedSum } = require("daggy");
    
    /**
     * Data type to repersent function:
     *
     *
     * httpGet = url => HttpGet(url)
     *
     * HttpGet(url)
     *  .chain(contents => HttpPost('/ayalytics', contents))
     *
     */
    
    const Http = taggedSum("Http", {
      Get: ["url"],
      Post: ["url", "body"],
    });
    
    // Free Http Get
    const httpGet = (url) => liftF(Http.Get(url));
    // Free Http Post
    const httpPost = (url, body) => liftF(Http.Post(url, body));
    
    const interpret = (x) =>
      x.cata({
        Get: (url) => Id.of(`contents for ${url}`),
        Post: (url, body) => Id.of(`Post ${body} to ${url}`),
      });
    
    const app = () =>
      httpGet("/home").chain((contents) => httpPost("/analytics", contents));
    
    const res = app().foldMap(interpret, Id.of);
    
    console.log(res.extract());
  • 相关阅读:
    window下安装nvm、node.js、npm的步骤
    命令行创建Android模拟器
    2016 JavaScript 各种排名
    js开发工作流
    javascript流行工具
    Linux下进程间通信的常用方法
    Linux下回收子进程wait函数和waitpid函数的基本使用
    Linux下exec函数族比如execve等函数的基本使用
    Linux下创建子进程fork函数等的基本使用
    vi操作键盘图
  • 原文地址:https://www.cnblogs.com/Answer1215/p/13219256.html
Copyright © 2011-2022 走看看