ファンクターをコンテナーとして表示するだけでなく、特定の種類のコンテキストとして表示することもできます。あなたの値はそのコンテキストにあり、それらを操作したい場合はmap
、関数をコンテキストに持ち上げるために使用します。別の言い方をすれば、あなたの価値観はその文脈で増強されるということです。
リスト ファンクターが非決定論的選択のコンテキストである方法を理解するには、別のファンクターがコンテキストである方法を確認することが役立つ場合があります。Maybe ファンクターは、失敗する可能性のある計算のコンテキストです。Maybe ファンクターの値に関数を適用しようとすると、結果の値は、そもそも計算が失敗したかどうかという同じコンテキストを保持します。
同様に、リストは決定論的な結果を持たない計算の結果と見なすことができますが、その結果は代わりにいくつかの値の 1 つから非決定論的に選択される可能性があります。3 つの要素を持つリストに関数をマップしようとすると、それらの要素は変更されますが、3 つの値から選択できるコンテキストは同じままです。
Dan Burtons の回答から少し借りて、リストのモナド表記を見てください。
foo = do
x <- [1 .. 10]
y <- [2, 3, 5, 7]
return (x * y)
各リストから 1 つの値を抽出できることを表記が示しているように見えるため、最初は少し奇妙に思えますが、結果として 40 要素の長さのリストが得られます。ファンクター (この場合はモナド) を単一の値のコンテキストとして見ると、より意味があります。例では、x
とy
はそのような値ですが、それらのコンテキストは非決定的であるということです。このような 2 つの値を乗算すると、非決定性がさらに高まり、リストが長くなります。したがって、モナド と>>=
ではコンテキストを変更できますが、ファンクター とmap
では変更できません。