Do-Notation 없이 중첩된 모나딕 계산에서 추상화

자바스크립트에서 모나드로 작업하자마자 하스켈과 같은 do-notation이나 Kotlin과 같은 다중 프롬프트 코루틴이 없기 때문에 중첩된 모나드 계산으로 끝납니다. 발전기도 작업에 충분하지 않기 때문에 사용할 수 없습니다.

그래서 우리는 다음과 같은 임시 방식으로 중첩된 모나딕 계산에 갇혀 있습니까?

// Monad

const arrChain = mx => fm =>
  arrFold(acc => x =>
    arrAppend(acc) (fm(x))) ([]) (mx);

// auxiliary function

const arrFold = f => init => xs => {
  let acc = init;

  for (let i = 0; i < xs.length; i++)
    acc = f(acc) (xs[i], i);

  return acc;
};

const arrAppend = xs => ys =>
  xs.concat(ys);

// MAIN

const main = arrChain([1,2]) (x => // nested monadic computation
  arrChain([3,4]) (y =>
    arrChain([5,6]) (z =>
      x === 1
        ? []
        : [x, y, z])));

main; // [2,3,5,2,3,6,2,4,5,2,4,6]


사실, 약간의 개선이 있습니다. 모나드 액션을 해당 모나드의 컨텍스트에서 래핑하여 적용 펑터처럼 취급할 수 있습니다.

// Monad

const chain3 = chain => tx => ty => tz => fm =>
  chain(chain(chain(tx) (x => fm(x)))
    (gm => chain(ty) (y => gm(y))))
      (hm => chain(tz) (z => hm(z)));

// MAIN

const main = chain3(arrChain) // much more readable
  ([1,2])
  ([3,4])
  ([5,6])
    (x => x === 1
      ? []
      : [y => [z => [x, y, z]]]);

main; // [2,3,5,2,3,6,2,4,5,2,4,6]


run code

주어진 chain3 우리는 더 많은 유연성을 얻기 위해 다른 arity 인식 결합자를 구현하고 가변성 내부에 과부하chainn할 수 있습니다.

JS의 FP에 대한 내 과정에서 이것 및 기타 FP 주제에 대한 추가 정보:
A fool's scriptum on functional programming .

좋은 웹페이지 즐겨찾기