[TIL] Day-7


javascript Es 6に基づく関数式プログラミングを学びました.
初めて関数式のプログラミングを勉強して、理解するのに多くの時間を費やしました.
私から見れば、最も重要なのは、どのパラメータにどの戻り値が含まれているかを把握し、利用することです.
関数の実行文は、値であってもよいし、関数自体であってもよい.
この2つの関数の評価はまったく異なるので,その関数が何を返しているのかよく理解しなければならない.

関数プログラミングとは?


関数をネストして連続的に実行しながら値として計算します.
最後の事柄を処理する方法で符号化する.
  • 関数型コードを読むとき오 -> 왼
  • 関数型コード作成時왼 -> 오位置(パラメータ)にどのような形式の値を含めるべきかを決定します.
    コードは
  • で適切な形式で計算されます.
    const products = [
            { name: '반팔티', price: 15000 },
            { name: '긴팔티', price: 20000 },
            { name: '핸드폰케이스', price: 15000 },
            { name: '후드티', price: 30000 },
            { name: '바지', price: 25000 },
        ];
    
    log(reduce( //2만원 이하의 상품들의 값을 합친 값
            add, 
            map(p => p.price, 
    	        filter(p => p.price < 20000, products))));

    コードを値として扱う


    go,pipe,curry関数は関数型プログラミングコードの表現力を向上させることができる.

    go

  • 関数式プログラミングコードを読みやすくする関数.
  • は、関数およびパラメータを直ちに伝達し、値を直ちに評価するために使用される.
  • の値を返します.
  • 初期値は引数として渡され、渡された引数で計算された戻り値は次の関数の引数となる.
  • を繰り返し、関数実行後に戻った値を後続の関数のパラメータに入れる
    const go = (...args) => reduce((a, f) => f(a), args);		
    
    go (
            products, // 시작 liter
            products => filter(p => p.price < 20000, products),
            products => map(p => p.price, products),
            prices => reduce(add, prices),
            console.log);

    pipe

  • 関数の関数を返します.
  • はすぐに実行されず、返された関数を実行する必要があります.
  • に必要な初期パラメータを加えると、内部でgo()が実行されます.
  • n個の関数を連続的に実行し、収縮した関数を作成して返します.
  • const pipe = (...fs) => (a) => go(a, ...fs); // 함수를 반환하는 함수
    
    const f = pipe(
            a => a + 1,
            a => a + 10,
            a => a + 100);
    
    console.log(f(0));
    
    --------------------------------------------------
    
    // 초기 값을 함수의 반환 값으로 하고싶다면?
    
    const pipe = (f, ...fs) => (...as) => go(f(...as), ...fs);
    
    const f = pipe(
            (a, b) => a + b, 
            a => a + 10,
            a => a + 100);
    
    console.log(f(0,1));
    

    curry


    希望する時点(条件)で
  • の値を持つ関数を実行する関数です.
  • 関数をパラメータとして関数を返します.
  • 必要に応じて
  • エンクロージャのパラメータ(変数、関数)を書き込みます.
  • まず
  • パラメータを入れ、次のパラメータが入ったときに実行します.
  • どうして書くの?
    go,pipe関数を用いると,パラメータとしての関数を簡略化し,読みやすくすることができる.
    const curry = f => (a, ..._) => _.length ? f(a, ..._) : (..._) => f(a, ..._);
    const map = curry((f, iter) => { // 함수를 할당할 때 query에 한 번 싸아서 넣는다
        let res = [];
        for (const a of iter) {
            res.push(f(a));
        }
        return res
        });
    
    
    
    // filter, map, reduce를 curry의 인수에 넣었다고 할 때,
    // 1단계
    go (
            products, // 시작 liter
            products => filter(p => p.price < 20000, products),
            products => map(p => p.price, products),
            prices => reduce(add, prices),
            console.log);
    
    // 2단계
    go(
        products,          
        products => filter(p => p.price < 20000)(products),
        filteredProducts => map(p => p.price)(filteredProducts),
        prices => reduce(add, prices)(prices),
        console.log);
    
    // 3단계
    // 인자 리스트로 함수가 들어가 있으면 자동적으로 
    // 인자가 들어가고 결과 값 반환되어 다음 함수의 인자로 넘겨진다
    go(
        products,          
        filter(p => p.price < 20000), // (..._) => f(p => p.price < 20000, ..._)와 같다
        map(p => p.price)
        reduce(add, prices),
        console.log);
    

    整数の組み合わせによる関数の作成


    重複する関数を別の関数に変更して、効率的に使用できます.
    const pipe = (...fs) => (a) => go(a, ...fs);
    
    const totalPrice = pipe(
    	map(p => p.price,
      reduce(add, prices)
    ) 
    
    const baseTotalPrice = predi => pipe(
    	filter(predi), 
      totalPrice,
    )
    
    go(
        products,          
        baseTotalPrice(p => p.price < 20000), 
        console.log);
    
    go(
        products,          
        baseTotalPrice(p => p.price >= 20000), 
        console.log);
    既存の関数を新しい関数に結合する場合、
    既存の関数を保持する場合は、次の操作を行います.
    →変数に直接入れて使う.
    コンパクトな関数を交換したい場合は、それを使用します.
    →パラメータを返す関数を操作するためにパラメータを受け入れる新しい関数を作成して割り当てます.
    授業を受けるのは最初は簡単だと思っていましたが、後になるほど脳が混乱します.
    go、pipeもそうですが、特にcurry...
    関数式プログラミングの観点から,単純明瞭に見えるが,その実現過程は非常に困難で複雑である.
    第1週目の作業では、資料の構造を完全に理解していないため、結果は満足できないので、第2週目には、概念と原理を完全に理解し、課題を体現したいと思います.しかし、すべてのことが過去を理解しようとしたので、時間がかかりすぎた.
    課題の期限が決まっているため、時間管理をある程度柔軟に学ぶことができます.
    やるべきことができた