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());
  • 相关阅读:
    jvm性能监控(4)–JVM的监控工具Jconsole
    jvm性能监控(3)-jdk自带工具 jps jstack jmap
    jvm性能监控(2)–JVM的监控工具jstat
    jvm(1)性能监控-linux相关命令
    jvm学习(5) 对象的创建与结构
    jvm(4) 对象创建
    jvm学习(3)方法区、堆、对象存储位置
    jvm学习(2)JVM内存说明
    java泛型
    windows下部署spring boot 的jar
  • 原文地址:https://www.cnblogs.com/Answer1215/p/13219256.html
Copyright © 2011-2022 走看看