• [Functional Programming Monad] Substitute State Using Functions With A State Monad (get, evalWith)


    We take a closer look at the get construction helper and see how we can use it to lift a function that maps the state portion and updates the resultant with the result. Using get in this fashion, we then demonstrate how we can make accessors that can then be extended to create more complex interactions.

    As there are times that we only want to pull the resultant for a given computation, we take a look at running our instances with the evalWith method. evalWith will run our computations, throwing away the state, returning the resultant.

    get() function return a Pair(a, s). 'a' is the return value (variable) and 's' is the orginal state.

    const { curry, compose, State, mapProps, prop, option } = require("crocks");
    
    const { modify, get } = State;
    
    const burgers = {
        burgers: 4
    }
    
    const taocs = {
        taocs: 10
    }
    
    const res = get()
        .map(prop('burgers'))
        .runWith(burgers)
    
    console.log(res); // Pair( Just 4, { burgers: 4 } )

    One thing we can improve from the code above is combine

    // From
    get()
        .map(prop('burgers'))
    
    // To
    get(prop('burgers'))

    Second the return value for the 'a' is wrapped in Maybe, we want to provided some default value for Nothing case:

    const res = get(prop('taocs'))
        .runWith(burgers)
    
    console.log(res); // Pair( Nothing, { burgers: 4 } )

    To do that we can create 'defaultProp':

    const defaultProp = (key, def) => get(prop(key)).map(option(def));
    const res = defaultProp('taocs', 0)
        .runWith(burgers)
    
    console.log(res); // Pair( 0, { burgers: 4 } )

    Thrid, we can  'compose' to simply the code further:

    const defaultProp = (key, def) => compose(
        option(def),
        prop(key)
    )
    const getBurgers = get(defaultProp('taocs', 0))
    const res = getBurgers
        .runWith(burgers)
    // Pair( 0, { burgers: 4 } )
    
    

    Last, we don't really care about the Pair(0, {burgers: 4}), we only interest the value: we can replace 'runWith' with 'evalWith':

    const defaultProp = (key, def) => compose(
        option(def),
        prop(key)
    )
    const getBurgers = get(defaultProp('burgers', 0))
    const res = getBurgers
        .evalWith(burgers) // 4

     ----

    const { curry, objOf, compose, State, mapProps, prop, option } = require("crocks");
    
    const { modify, get } = State;
    
    const burgers = {
        burgers: 4
    }
    
    const taocs = {
        taocs: 10
    }
    const defaultProp = (key, def) => compose(
        option(def),
        prop(key)
    )
    const getBurgers = get(defaultProp('burgers', 0))
    const burgerToTacos = getBurgers.map(objOf('tacos'));
    const res = burgerToTacos
        .evalWith(burgers) // 4
    
    console.log(res); // { tacos: 4 }
  • 相关阅读:
    ACM: Copying Data 线段树-成段更新-解题报告
    POJ 2488 A Knight's Journey
    POJ 3349 Snowflake Snow Snowflakes Hash
    POJ 2299 Ultra-QuickSort 归并排序、二叉排序树,求逆序数
    POJ 1035 Spell checker 简单字符串匹配
    POJ 3267 The Cow Lexicon 简单DP
    POJ 1459 Power Network 最大流(Edmonds_Karp算法)
    POJ 3687 Labeling Balls 逆向建图,拓扑排序
    HDU 1532 Drainage Ditches 最大流 (Edmonds_Karp)
    POJ 3026 Borg Maze bfs+Kruskal
  • 原文地址:https://www.cnblogs.com/Answer1215/p/10334584.html
Copyright © 2020-2023  润新知