ニコニコ大百科モバイル

7/2(月)よりスマホまたはPCでアクセスした場合、各デバイス向けのサイトへ自動で転送致します


リストモナド


ヨミ: リストモナド

この記事はモナド(プログラミング)の一部として作成された内容を元にしています。


概要


プログラミングリストといえば、複数の同データを順番に並べたデータ構造をすが、Haskellではこれもモナドの一種として扱われる。ちなみに「扱われる」というだけで、他の言であろうとリストというデータ構造を持っている以上モナド則を満たすことが出来るのでモナドである。


unitList()


unitList(x)はxのみを要素とするListを生成する。


flatMapList()


flatMapList(Ax, f)は、Axの各要素に関数 f を適用した結果できるリストの要素すべてを一つのリストにする。

(Stateモナドでは適用できても正しくないということであったが)今度はモデルは適用すら出来ない。

の中に複数のx: x1, x2, ... が入っているものに関数 f を適用しようとするのであるが、 f が引数の取ることができるは x であって、複数の x (の配列)ではないからである。

やはりモデルは初期の理解のみに用いて、くそこから離れるべきであろう。


結合演算 ":"


一体いつから───────モナドの操作がunit()flatMap()だけだと錯覚していた?

複数の要素を持つために必要な演算子。


リストモナドと非決定性計算


Haskellではリストモナドは非決定計算という言葉で紹介される。

リスト普通リストとして見ると非決定性計算というのが何か分からないが、可性を列挙したリストであると考えれば意味がわかるかもしれない。


意義


性を列挙したリスト: 非決定性計算と位置づけられるが、リストモナドは可性を列挙する非決定性計算に必要ない2つの情報を保持している。

重複する要素と、要素の順番である。(情報が増えるモナドと言えるだろうか)

ところでこの2つの情報を持たないリストといえば、多くのプログラミング言語にあるSet(集合)が該当する。


コラム: Setはモナドなのか


この問いは悪問である。モナド(プログラミング)で述べたように、モナドになるためにはデータ構造以外にunit(), flatMap()の定義が不可欠である以上、Setのみを取り上げてモナドかどうか問うべきではない。しかし、Listモナドを参考にすれば、Setモナドにするunit(), flatMap()を定義するは難しいことではない。

すなわち、unitSet(x)は x のみを要素とするSetflatMap(Ax, f)は、Axの各要素に関数 f を適用した結果できるSetの要素すべてを重複を除きながら一つのSetにする。


どうして非決定性計算といえばSetではなくリストモナドなのか


要出典だが、おそらく、SetよりもListの方が重複検証がいらない分、Listの方が実装が簡単だったので、わざわざ難しいことをして情報を削ろうと考えなかったのかもしれない。あるいはLispか。


空のリスト


リスト(要素数0のリスト)というのはぬるぽのようなものである。実際Lispなどでは nil という特別な値として扱われる。

タプル


関連項目



最終更新日: 19/06/29 09:42
タグ検索 パソコン版を見る


[0]TOP
ニコニコ動画モバイル
運営元:ドワンゴ