非同期およびシングルスレッド JavaScript?
JavaScriptはシングルスレッド言語であると同時に、ノンブロッキング、非同期、並行処理も可能です。この記事では、その仕組みを説明する。
JavaScriptの関数型プログラミングのパワーの第3弾をご覧ください。今回はJavaScriptのエキスパートがファンクターとモナドについて詳しく説明します。
多くの場合、変更不可能な状態を維持するのは難しい。そこで、データをコンテナにラップするパターンが有効だ。これにより、値を安全に扱うことができ、副作用を排除することができる。
初めての方は、The Codestブログの関数型プログラミングに関する最後の2つのパートを必ずチェックしてください:
複雑なロジックは持たない。その主な仕事は、コンテキストをラップし、外部から受け取った関数をそれに対して実行することである。値が変更されるたびに、新しいコンテナのインスタンスが再パッケージされて返される。コンテナ・インスタンスを呼び出すとき 地図 メソッドに特定のアクションを渡すと、変更不可の原則を維持したまま、渡された関数が返す値を持つ新しいコンテナ・インスタンスを返します。
const ファンクター = 値 => ({)
map: fn => Functor(fn(value))、
chain: fn => fn(value)、
の:() => 値
});
地図 - コンテナ内の値の状態を変更したいが、まだそれを返したくない場合に便利。
チェーン - コンテナの状態を変更せずに関数に値を渡したい場合に使用する。通常は 地図 のコール。
の - 現在値を返す
const randomInt = (max) => Math.floor(Math.random() * (max + 1))
const randomNumber = randomInt(200) // 0 から 200 までの数を返す。
decrease(randomNumber) // (0 から 200 までの数) - 1 を返します。
const randomIntWrapper = (max) => ランダムIntラッパー。
ファンクタ(max)
.map(increase) // max + 1
.map(multiplyBy(Math.random()))// Math.random() * (max + 1)
.map(Math.floor) // Math.floor(Math.random() * (max + 1))
const randomNumber = randomIntWrapper(200)
randomNumber.of() // 0 から 200 までの数を返す
randomNumber.chain(decrease) // (0 から 200 までの数) - 1 を返す
値の新しい状態をトリガーする関数に加えて、コンテナに隠された追加ロジックが必要になることもある。そこで便利なのがモナドである。 ファンクタ.例えば、値がある値になったときに何が起こるか、あるいは次のアクションがどのような経路をたどるかを決定することができる。
モナドはもしかしたら、真を返さない値の問題を解決してくれるかもしれない。この場合、後続の 地図 の呼び出しは無視される。 ゲットオア メソッドを使うことができる。でよく使われるif/else演算子の使用を避けることができる。 必要不可欠 プログラミングを行う。このモナドは3つのコンテナで構成されている:
何もない - 真でない値がコンテナまたは フィルター メソッドは偽を返す。これは関数の実行をシミュレートするために使用される。つまり、このコンテナは関数を受け取りますが、実行はしません。
ただ - これは、すべての機能を実行するメイン・コンテナであるが、値が偽の値に変更された場合、または フィルター メソッドがfalseを返すと、それを 何もない コンテナ
たぶん - 私は初期値を受け取り、最初に呼び出すコンテナを決める。
const Just = value => ({
map: fn => Maybe(fn(value))、
chain: fn => fn(value)、
の:() => value、
getOr: () => 値、
filter: fn => fn(value) ?Just(value) :Nothing()、
type: 'just'
});
const Nothing = () => (
map: fn => Nothing()、
chain: fn => fn()、
の:() => Nothing()、
getOr: substitute => substitute、
filter: () => Nothing()、
type: 'nothing'
});
コンス ト Maybe = value =>
value === null || value === undefined || value.type === 'nothing' ?
?Nothing()
:Just(value)
では、条件について先ほどの例を組み立ててみよう。もしmaxが0より大きければ、関数が実行される。そうでなければ0を返す。
const randomInt = (max) => { { { もし(max > 0)
if(max > 0) {
return Math.floor(Math.random() * (max + 1)).
} else {
return 0
}
}
const bookMiddlePage = 200
const randomPage = randomInt(10) || bookMiddlePage // ランダムを返す.
const randomPage = randomInt(-10) || bookMiddlePage // 200 を返す.
const randomIntWrapper = (max) => ランダムIntラッパー。
Maybe(max)
.filter(max => max > 0) // 値falseはそれ以降の呼び出しを無視する。
.map(increase)
.map(multiplyBy(Math.random()))
.map(Math.floor)
const bookMiddlePage = 200
// 単なるコンテナ
const randomPage = randomIntWrapper(10).getOr(bookMiddlePage) // ランダムを返す.
// 何もないコンテナ
const randomPage = randomIntWrapper(-10).getOr(bookMiddlePage) // 200 を返す.