Lodash-fpモジュール、Lodash-map方法の小さな問題、Pointfree

20011 ワード

ローダッシュのFPモジュール
  • 関数組合せを使って問題を解決する際には、lodashで提供される方法が使われますが、これらの方法に複数のパラメータがある場合は、これらの方法をコリック化する必要があります.これらの方法を新たに包装する必要があります.ちょっと面倒です.次に、lodashのfpモジュール
  • を紹介します.
  • lodash/fp
  • lodashのfpモジュールは、実用的な関数式プログラミングに友好的な方法を提供している
  • 可変aut-curried、iteratee-first、data-last
  • を提供しています.
    // lodash      ---     ,    
    const _ = require('lodash')
    
    console.log(_.map(['a', 'b', 'c'], _.toUpper))
    // => [ 'A', 'B', 'C' ]
    
    console.log(_.map(['a', 'b', 'c']))
    // => [ 'a', 'b', 'c' ]
    
    console.log(_.split('Hello World', ' '))
    // => [ 'Hello', 'World' ]
    
    
    // lodash/fp    ---     ,    
    const fp = require('lodash/fp')
    
    console.log(fp.map(fp.toUpper, ['a', 'b', 'c']))
    console.log(fp.map(fp.toUpper)(['a', 'b', 'c']))
    // => [ 'A', 'B', 'C' ]
    
    console.log(fp.split(' ', 'Hello World'))
    console.log(fp.split(' ')('Hello World'))
    // => [ 'Hello', 'World' ]
    
  • lodashとlodash/fpの実際使用時の違い
  • // lodash  NEVER SAY DIE     never-say-die
    const _ = require('lodash')
    
    const map = _.curry((fn, array) => _.map(array, fn))
    const split = _.curry((sep,str) => _.split(str,sep))
    const join = _.curry((sep, array) => _.join(array, sep))
    
    const f = _.flowRight(join('-'), map(_.toLower), split(' '))
    console.log(f('NEVER SAY DIE'))
    
    
    //   lodash/fp  
    const fp = require('lodash/fp')
    
    const f = fp.flowRight(fp.join('-'), fp.map(fp.toLower), fp.split(' '))
    console.log(f('NEVER SAY DIE'))
    
    lodashとlodash/fpモジュールにおけるmapメソッドの違い
    //                     
    
    // lodash
    
    /**
     *     ,    
     * 
     *       --- [23, NAN, 2] ---        
     * 
     *          Map      parseInt    ,     
     * 
     *      Map       ,           ,
     *    :value - index|key - collection
     *               ,        index  
     *                    key
     *         collection
     * 
     *             :
     *           map ,                ,            parseInt    
     * 
     *       :   parseInt('23', 0, array)
     *       :   parseInt('8', 1, array)
     *       :   parseInt('10', 2, array)
     * 
     *   parseInt                        ,        ,       2-36
     * 
     *     0         ,        10    ,
     *   1    ,     ,   NAN
     *   2        2  ,10 2     2
     * 
     *              ,       [23, 8, 10]
     * 
     *               parseInt,         ,    lodash/fp   
     * */ 
    const _ = require('lodash')
    console.log(_.map(['23', '8', '10'], parseInt))
    // => [23, NAN, 2]
    
    
    /**
     *     lodash/fp  map   ,              
     * 
     * Map          ,          ,  fp                
     *                ,           ,  lodash map          
     *         ,  lodash/fp      !
     * */ 
    const fp = require('lodash/fp')
    console.log(fp.map(parseInt, ['23', '8', '10']))
    // => [23, 8, 10]
    
    
    Point Free
  • プログラミングのスタイルですが、具体的には関数の組み合わせがより抽象的で、
  • Point Free:データ処理過程をデータとは関係ない合成演算として定義することができます.代表データのそのパラメータを使う必要はありません.簡単な演算手順を一緒に合成すれば、このようなモードを使う前に補助的な基本演算関数を定義する必要があります.
  • 指定処理が不要なデータ
  • 合成演算のみが必要
  • いくつかの補助的な基本演算関数を定義する必要がある(私たちが以前に関数を組み合わせて問題を解決するときはPoint Freeモードです)
  • const f = fp.flowRight(fp.join('-'), fp.map(fp.toLower), fp.split(' '))
    
  • 判例デモ
  • // Hello World ---> hello_world
    
    /**
     *  Point Free
     * 
     *                     ,                  ,         
     * */ 
    function f (world) {
         
        return world.toLowerCase().replace(/\s+/g, '_')
    }
    
    /**
     * Point Free
     * 
     *             ,             ,       ,                
     * 
     *         :          
     * 
     *  Point Free               ,          ,                  
     *                    
     * */ 
    const fp = require('lodash/fp')
    
    // fp            ,            ,        
    //    :      ---      
    //    :       
    //    :     
    const f = fp.flowRight(fp.replace(/\s+/g, '_'), fp.toLower)
    
    fp.replace
    console.log(f('Hello World'))
    
    Point Free事例
    // world wild web ==> W. W. W
    
    const fp = require('lodash/fp')
    
    //    
    // const f = fp.flowRight(fp.join('. '), fp.map(fp.first), fp.map(fp.toUpper), fp.split(' '))
    
    //    
    const f = fp.flowRight(fp.join('. '), fp.map(fp.flowRight(fp.first, fp.toUpper)), fp.split(' '))
    
    console.log(f('world wild web'))