function _do(M, genfn){ const gen = genfn(); return recur(gen, null); function recur(gen, prev){ const {value, done} = gen.next(prev); const ma = value instanceof M ? value : M.pure(value); return ma.bind((a)=> !done ? recur(gen, a) : M.pure(a) ); } } JS の do は予約語なので _do にしてます do 構文は、モナディックな型の値 m1, m2, m3 を逐次返す generator を引数にとる そして ma.bind((a)=> mb.bind((b)=> mc.bind((c)=> Monad.pure(c) ))) のように計算