リストモナド単語

リストモナド
  • 0
  • 0pt
掲示板へ

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

概要

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

unitList()

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

flatMapList()

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

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

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

理すれば後述のようにに押し込めなくもないが、やはりモデルは初期の理解のみに用いて、くそこから離れるべきであろう。

結合演算 ":"

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

複数の要素を持つために必要な演算子。x : Axは、リストAxの先頭にxが追加されたリストを表す。

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

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

意義

リスト普通データ構造として見ると、どこが非決定性計算なのか分からないが、可性を(一つに絞って決定することく)列挙したリストであると考えれば意味がわかるかもしれない。

この見方をした時、flatMapList(Ax, f)のfは「リストAxの要素一つから生じる可性を列挙したリスト」を出する関数ということになる。すなわち、flatMapList(Ax, f)は「それぞれの可性(リストAxの要素)から枝分かれした可性をすべてリストアップしたもの」と捉えることができる。

Ax
x1 x2 x3
↓f(x1) ↓f(x2) ↓f(x3)
x1-1, x1-2, … x2-1, x2-2, … x3-1, x3-2, …
flatMapList(Ax, f)

コラム: 非決定性計算とSet

リストモナドは可性を列挙する非決定性計算に必要ない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 という特別な値として扱われる。

タプル

関連項目

【スポンサーリンク】

  • 0
  • 0pt
スマホ版URL:
https://dic.nicovideo.jp/t/a/%E3%83%AA%E3%82%B9%E3%83%88%E3%83%A2%E3%83%8A%E3%83%89

この記事の掲示板に最近描かれたお絵カキコ

お絵カキコがありません

この記事の掲示板に最近投稿されたピコカキコ

ピコカキコがありません

リストモナド

まだ掲示板に書き込みがありません…以下のようなことを書き込んでもらえると嬉しいでーす!

  • 記事を編集した人の応援(応援されると喜びます)
  • 記事に追加して欲しい動画・商品・記述についての情報提供(具体的だと嬉しいです)
  • リストモナドについての雑談(ダラダラとゆるい感じで)

書き込みを行うには、ニコニコのアカウントが必要です!