zoukankan      html  css  js  c++  java
  • [Functional Programming] Arrow Functor with contramap

    What is Arrow Functor?

    Arrow is a Profunctor that lifts a function of type a -> b and allows for lazy execution of the function. Arrow can be considered a Strong Profunctorif the underlying data running through the Arrow is a Pair, typically in the form of Arrow (Pair a c) (Pair b d).

    This will allow you to split execution into two distinct paths, applying Arrow to a specific path. The parameters of Arrow represent the function that it wraps, with the input being on the left, and the output on the right. When anArrow wraps an endomorphism, the signature typically represents both the input and output.

    In short, Arrow is

    • Take a function
    • Function will be lazy
    • We can apply params later
    const Arrow = require('crocks/Arrow');
    
    const arrUpper = Arrow(
        str => str.toUpperCase()
    )
    
    log(
        arrUpper.runWith('zhentian')
    ) // ZHENTIAN

    Why this can be useful? 

    In this post, we are going to see an exmple about how to use 'Arrow' with 'contramap':

    Currently 'arrUpper' take a string as input, sometimes the data we receive might be is an Object:

    // {name: 'zhentian'}

    In this case, we cannot directly using 'arrUpper', and we don't want to modify our 'arrUpper' function to be:

    const arrUpper = Arrow(o => o.name && o.name.toUpperCase())

    What we can do is using 'contramap' to apply an function on the input param of 'arrUpper', to change the Object type to String type, we can keep the 'arrUpper' untouched:

    const Arrow = require('crocks/Arrow');
    const chain = require('crocks/pointfree/chain');
    const option = require('crocks/pointfree/option');
    const prop = require('crocks/Maybe/prop');
    const safe = require('crocks/Maybe/safe');
    
    const getName = compose(
        option('no name'),
        chain(safe(isString)),
        prop('name')
    )
    const arrUpper = Arrow(
        str => str.toUpperCase()
    )
    const nameUpper = arrUpper
        .contramap(getName)
    
    log(
        nameUpper.runWith({name: 'zhentian'})
    ) // ZHENTIAN

    What 'contramap' does is apply the given function (getName) to the target function (arrUpper)'s params ({name: 'zhentian'}), before the target function get invoked.

    So in our example, we transform the {name: 'zhentian'} to just 'zhentian' or 'no name' before passing to arrUpper.

  • 相关阅读:
    现代编程语言:Rust (铁锈,一文掌握钢铁是怎样生锈的)
    mRNA(阅读链接)
    技术的极限(13): 对过程和细节的可视化
    现代编程语言:TypeScript
    现代编程语言:JavaScript
    现代编程语言:zig
    现代编程语言:Python(蛇形遍历一颗树)
    炼金术(9): 简约而不简单,永不停歇的测试 -- always_run
    软件性能测试分析与调优实践之路-Web中间件的性能分析与调优总结
    退役记
  • 原文地址:https://www.cnblogs.com/Answer1215/p/10569099.html
Copyright © 2011-2022 走看看