stanford-oval/wikipedia huggingface dataset:
南海の花束
解説

八木隆一郎の戯曲「赤道」を元に、日本委任統治領だった南洋群島で赤道越え民間航空路を開拓する支所長と操縦士たちを描く。
厳格な支所長と操縦士たちの葛藤や航空事故を克服する姿を描くことにより、当時国策として進行していた南洋進出を宣伝するプロパガンダ映画である一方、阿部豊による演出が人間ドラマをより強調した内容になっている。嵐の中の飛行シーンは、円谷英二によってミニチュア特撮によるリアリティのあるシーンが撮影され、一部の操縦席のシーンではスクリーン・プロセスも用いられている。クライマックスの3重合成で描写された嵐の洋上の飛行艇も、評価されている。
大日本航空の後援により、海軍から払い下げられて用いていた一五式水上偵察機や九三式中間練習機、実際に南洋航路に就役していた九七式飛行艇などの実機が登場し、整備風景や離着水シーンも実機によるものが用いられている。ただ、制作当時は戦時中であったにもかかわらず、敵性語である「システム」などの英語も一部に登場する。
助監督の市川崑によれば、太平洋戦争が開始される直前の日本委任統治領だったパラオでロケ撮影をしており、横浜から川西式四発機という大型水上機に搭乗して1941年（昭和16年）8月に現地へ向かったが、阿部が脚本を気に入らず、11月になっても撮影が進まない日々が続いたため、日米開戦を危惧するスタッフの焦燥に業を煮やした市川が降板覚悟で阿部を催促してようやく撮影が開始され、開戦1週間前の12月8日に貨客船で帰国するというギリギリの状況で、ロケ撮影は完了した。市川は、「もう少し撮影が遅れていたら、生きて帰れなかったかもしれない。まさに、間一髪で命拾いしました」と後年に証言している。
あらすじ

興亜航空の南洋支所に、新しい支所長である五十嵐が赴任した。五十嵐は就任早々、支社の綱紀強化と赤道を越える南洋航路開拓を宣言すると、無事故の実績から反発する操縦士たちに構わず、飲酒飛行の禁止や操縦士の身体検査を決行し、素行不良の石川を地上勤務に配置転換する。一方、嵐の中の郵便飛行を決行させたため、伏見と原田を行方不明にしてしまう。やり方を曲げない五十嵐に操縦士たちは敵意を募らせるが、遭難の原因がエンジン故障であることが査問委員会で判明し、郵便物だけはブイにくくりつけられて無事であったことが確認される。飛行学校で五十嵐の生徒だった堀田は、片足を負傷した五十嵐が操縦できない気持ちを一番分かっていることを操縦士たちに伝える。
数日後、内地から部下である日下部を招いた五十嵐は、早々に原田の代わりを自分の身内で固めたと陰口を言われるが、その直後に伏見と原田が不時着先から帰還する。やがて、操縦士の間にも規則遵守の気運が高まり、妻の出産が近い西條も規則どおりに郵便飛行に出発する。しかし、5日後にインコを手土産として戻った西條に、堀田は男児が誕生から2日で夭折したことを伝える。
南洋航路開拓は五十嵐の考えよりも早く、国策として早急に行われることになった。南洋支所にも配備された巨大な飛行艇の勇姿に、地上任務が続く石川は苛立ちから発狂してしまう。第1回開拓飛行の操縦士として日下部が選ばれて訓練に入るが、引退間近である堀田の希望から、第1回開拓飛行は堀田たちの手で行なわれることになった。しかし、堀田機は飛行中に台風に遭遇したうえ、雷が右翼に直撃して遭難する。1週間の捜索もむなしく、第1回開拓飛行の乗員全員の死亡が宣告される。第2回開拓飛行の操縦士に選ばれた日下部は、出発直前に堀田の妻から遺品であるパイプと煙草缶を手渡される。晴天に恵まれ、順調に堀田機の遭難地点に達した日下部は、昇降扉から花束とパイプを海に投げ、堀田たちの冥福を祈るのであった。
配役

支所長・五十嵐：大日方傳
操縦士・日下部：河津清三郎
操縦士・原田秀樹：大川平八郎
操縦士・堀田貫作：真木順
操縦士・伏見：月田一郎
操縦士・西條：清水将夫
操縦士・石川：田中春男
前支所長・林：菅井一郎
乗務員・古賀：龍崎一郎
乗務員・池地：社栄一
乗務員：佐山亮、三田進、木下陽、寺島新、津田光男、井上忠美、江藤勇、金光嗣郎、小森敏、竹林武八郎
整備員：光一、岬洋二、沢村昌之助、大谷友彦、鉄一郎
査問委員：清川荘司、御橋公、進藤英太郎、浜田格
無電技師：冬木京三、柳谷寛
司令塔員：三木利夫
堀田信子：杉村春子
原田里子：堤真佐子
伏見やす子：谷間小百合
スタッフ

検閲：横須賀鎮守府 第三二九号
後援・指導：大日本航空株式会社
脚本：阿部豊・八木隆一郎
製作主任：井上溶
撮影：小原譲治
特殊撮影：円谷英二
録音：樋口智久
美術：北猛夫・北辰雄
照明：大沼正喜
現像：西川悦二
編集：後藤敏男
音楽：早坂文雄
演奏：東宝管弦楽団
演出：阿部豊
備考

後年に東宝で特技監督を務めた有川貞昌は、19歳の時に本作品を観賞したことから飛行艇の操縦士を志し、海軍航空隊に入隊したという。鑑賞当時、有川は作中に登場する飛行機がミニチュアだとは思いもよらなかったという。
脚註

[脚注の使い方]
混一疆理歴代国都之図

| 混一疆理歴代国都之図(1402) |
| --- | --- |

韓国式ローマ字: Honilgangniyeokdaegukdojido
北朝鮮式ローマ字: Honilgangriryŏkdaegukdojido
韓国式ハングル: 혼일강리역대국도지도（ホニルガンニヨクデグクトジド）
北朝鮮式ハングル: 혼일강리력대국도지도（ホニルガンリリョクデグクトジド）
繁体字: 混一疆理歷代國都之圖
略称: Gangnido (Kangrido; 강리도; 疆理圖)（南：カンニド、北：カンリド）
混一疆理歴代国都之図（こんいつきょうりれきだいこくとのず）、略称疆理図（きょうりず）とは1402年に李氏朝鮮で作られた地図。名称は「歴史上の首都一覧図」を意味する。（「混一」はひとまとめを、「疆」は国境あるいは国土を意味する。）混一疆理図と略されることもあるが、後述する清浚による『混一疆理図』と紛らわしいため、あまり使われない。1402年という作成年は、下に書かれている奥付に基づく。現存するものは写本のみであり、それに書かれている地名から類推すると、遅ければ1592年の情報が混入している可能性もある。
これはモンゴル帝国を表した地図としても有名であり、イスラムの先端科学と中国の先端科学が統合してできたものである。この地図は西はアフリカ、ヨーロッパから東は日本まで、いわゆる旧世界全体を表している。この地図は、15世紀末まで、世界地図としてヨーロッパのものよりも優れていた。
現存する写本

現存するものはわずか2つであり、いずれも日本にある。
現在龍谷大学が所有するもの（同大学大宮図書館所蔵。以後「龍谷大学図」と表記）は、20世紀初頭から近代的学問の手法での研究対象になっている。大きさは163cm×158cmで、絹布の上に描かれている。龍谷大学本は朝鮮半島で作られた写本と見られるが、いつごろ日本にもたらされたかは分かっていない。大谷光瑞が買い求めたという説と、16世紀末の文禄・慶長の役の際に獲得したものを豊臣秀吉が西本願寺に与えたという説がある。
もう一つは1988年に長崎県島原市の本光寺で発見されたもの（以後「本光寺図」）である。これは龍谷大学図よりもかなり大きい280cm×220cmである。本光寺図は江戸時代の日本で複写されたものと見られる。
日本には、さらに疆理図に関連する地図が2つある。熊本の本妙寺にある「大明国地図」、天理大学にある「大明国図」である。この2つは後年にオリジナルから複写したものと見られる。最も大きな違いは、中国の表記が「元」であるところが「明」となっていることである。
寺に伝わっている話によると、本妙寺の地図は加藤清正が文禄・慶長の役に際して豊臣秀吉から賜ったものということになっている。しかしながら、朝鮮王朝側の証言として1593年に記された宣祖実録によると、「加藤清正に降伏した朝鮮官僚の息子が中国と韓国の地図の複写を提供した」との記録があり、これが本妙寺の地図である可能性がある。
地図作成に使われた情報

龍谷大学図と本光寺図には、地図の下段に権近による奥付がある。『陽村先生文集』（陽村は権近の別名）にも同様の記録がある。権近によると、疆理図作成の際に4つの地図を参考にしている。
李沢民による声教広被図（世界地図）
清浚による混一疆理図
無名の朝鮮半島地図
無名の日本地図。行基図と考えられている。
建文4年（1402年）、韓国政府の金士衡、李茂、李薈は2種の中国地図を組み合わせて新しい地図を作った。李沢民の地図は満洲南部に流れる遼河の少し先までしか描かれていなかったので、朝鮮半島全部と日本も加えた地図にした。これが疆理図である。以下、その成立の過程を解説する。
地図作成に使われた情報 > モンゴル帝国の地図

疆理図の成立はモンゴル帝国の歴史と深い関わりがある。モンゴル帝国は、西のイスラム世界と中国世界を繋いだ。モンゴル帝国は世界の地理と記録文化を統一することで、世界征服の事実を知らしめた。これにより、イスラムの先進科学と中国の先端科学が融合することになった。ただし、モンゴル帝国が中国に流通させた地図はあくまで「民間用」であった。モンゴル帝国はこの地図に描かれているよりもずっと詳細な情報を集めていたものと思われる。
1285年、モンゴル帝国は大元大一統志(zh)という地理解説書を作成した。（ただし地図部分は失われている。）1286年、ペルシア人の天文学者ジャマールッディーン（札馬剌丁）はモンゴル皇帝（カアン、大ハーン）クビライに対して、帝国領土の地図を集めて世界地図を作ることを提案し、天下地理総図を完成した。この図も、現代には伝わっていない。一方彼は、イスラムの船乗りから『Rāh-nāmah』（道路図）を入手した。その地図は、経世大典（1329-1333）に収められており、モンゴル人がイスラム教徒から正確なアジア内部の地理情報を得ていたことを証明している。これらの文化事業の影響を受け、1297年、道教の道士朱思本は九域志と呼ばれる地理解説書を完成した。彼はこの仕事を継続し、1311 - 1320年に輿地図と呼ばれる地図を作成した。この地図も、現存していない。
しかし、これらの資料は流通するには大きすぎた。中国の知識人達に影響を与えたのは、二次的資料だった。14世紀前半、翰墨全書や、陳元靚が編集した事林広記といった百科事典が作られ、中国人の知識は金や南宋時代の情報から元朝による新しい情報に更新された。
近年見つかった資料から、中国南部、とりわけ慶元路（現寧波）の辺りに、知識人達の個人的なネットワークがあったことが明らかにされている。泰州出身の清濬は慶元で『混一疆理図』を作成した。重要な文献を残したことで知られる烏斯道(zh)もまた慶元出身であった。当時から寧波は重要な港の1つであり、福州、広州、東南アジア、日本、高麗と交易があった。彼らはイスラムの船乗りから海の知識を得ていたものと思われる。
地図作成に使われた情報 > モンゴル帝国の地図 > 声教広被図

李沢民の『声教広被図』（世界地図）は今日失われている。元の状態が後の時代の地図から再現されている。羅洪先の『広輿図』(1555)に収められた『東南海夷図』、『西南海夷図』が、沿岸と島嶼を除いた大部分が声教広被図の南半分のコピーであると考えられている。満洲語で描かれた明代の地図大明混一図もまた、李沢民の地図の複写と考えられている。
声教広被図は世界地図である。中国だけでなく、アフリカやヨーロッパも含まれていた。羅洪先の地図や大明混一図の内容から、声教広被図の方が後に李氏朝鮮で作られた疆理図よりも17世紀インドの地理を正確に表現していたものと考えられている。
作者李沢民についてはほとんど何も伝わっていない。地図上の地名からの類推で、声教広被図は1319年ごろに作られたものであり、1329～1338年頃に修正が加えられたものと思われる。もっとも、後に述べる烏斯道の言からは声教広被図が清濬の地図(1360?)よりも新しい可能性もある。
地図作成に使われた情報 > モンゴル帝国の地図 > 広輪疆理図

道士の清浚(1328 - 1392)が作った『混一疆理図』もまた失われている。だが、明代の書籍収集家葉盛(1420 - 1474)の撰である水東日記に収められている『広輪疆理図』が混一疆理図の修正版と見られている。葉盛は厳節の奥付がなされた地図(1452)の記録も残している。厳節によると、広輪疆理図は1360年に作られたとのことである。もっとも、現存しているものには厳節によるものと思われる改変が加えられており、明代の地名が散見される。オリジナルであれば、元代の地名が記されているはずである。
『広輪疆理図』は歴史地図として中国の学者の間では有名だった。そこには当時の地名に加えて、旧都も記されていた。それはあくまで中国の歴史地図であり、世界地図ではなかった。だが、宋代の地図にはない、モンゴルや東南アジアの情報も含まれていた。海路も描かれていた。同じ海路が先述した本妙寺の地図にも描かれている。
地図作成に使われた情報 > モンゴル帝国の地図 > 烏斯道の業績

李氏朝鮮で作られた地図の意義は、2つの中国地図を結合したことにあるだろう。もっとも、同じことがすでに烏斯道による春草斎集でなされている。烏斯道は『広輪図』と李汝霖による『声教被化図』（現代には伝わっていない）の統合を試みている。広輪図とは先に見た『広輪疆理図』のことと考えられている。また、李汝霖は李沢民の別名であり、声教被化図もまた声教広被図と同じものと思われる。
学者達は、文献上の根拠こそないが、金士衡が1399年に中国に旅行をした際、この2種類の中国地図を手に入れたものと考えている。別の可能性として、権近の奥付から類推すると、烏斯道の業績を含めていくつかの機会に亘って少しずつ地図が集められたとも考えられる。
地図作成に使われた情報 > 朝鮮の地図

権近は、朝鮮半島の地理に関しては、李沢民の地図が不正確であると考えた。彼が手に入れた李沢民の地図の南半分には詳しい記述がなかったのである。清浚の地図は高麗の記述に関しては李沢民の地図よりいくらかましであった。
それでも権近はこれを正しい朝鮮半島の姿とは考えず、詳しいことは明らかでないが、李薈による八道図を多分に参考にしたものと考えられている。ただし、現存する最も古い高麗地図は1470年代のものであり、参考にした情報がどのようなものであったのかは不明確である。
なお、権近の注釈によれば、朝鮮半島が大きく描かれているのは、見やすくするためにわざとしたことであるとのことである。
地図作成に使われた情報 > 日本の地図

中国の2つの地図には、日本は東西に亘る3つの島として描かれている。これは、徐福の伝説に基づくところが大きいためと思われる。前漢時代に編纂された史記によると、徐福は海中に三つの山でできた島があるとの話を残しており、中国人は長い間それが日本の事だと信じていた。
龍谷大学図に描かれている日本は、これまでの中国の地図のものより正確な形をしているが、向きが90度回転している。この事実は学者達の興味を引き、邪馬台国の位置を巡る論争の根拠にもなった。もっとも、他の3図には普通に描かれており、龍谷大学図の日本列島の角度の方が例外である。
4つの複写地図に描かれた日本はそれぞれかなり異なっているため、元の図にどのように描かれていたかはよく分からない。本光寺図は海東諸国紀に収録された地図との類似点が多いため、情報が更新されているものと考えられている。
地図のうち、権近の業績に基づかない部分は、世宗実録の世宗即位年10月条に述べられている、朴敦之が1401年に日本を訪れた際に入手した地図に基づいているものと考えられてきた。しかしながら、朴敦之が大内氏の元に留まっていたのは1397年から1399年までのことであり、この説は明らかに間違っている。
内容

全体としては、疆理図は、李沢民の声教広被図に基づいている。西方地域の面積が実際よりも大分小さいものの、西方のアフリカ・ヨーロッパから東方の日本に至るまで旧世界の概要を正確に示している。つまり、東方社会ではモンゴル時代以前には知りえなかったアフロ・ユーラシア大陸についての地理的情報が含まれている。地図上の地名から、西方の情報は14世紀前半のものであると考えられている。この後も東方では、マテオ・リッチのようなヨーロッパ人が西洋の情報をもたらすまでは、西方の地理情報が更新されることはなかった。
これとは別に、中国とイスラムの地理情報は更新されている。更新されているのは、デリーとビシュバリク(zh,ウルムチ近郊)を結ぶ南北線より東の情報である（ビシュバリクはオゴデイからモンケ時代、モンゴル帝国の中央アジア行政の中心であった）。これよりも西の情報は、本当はビシュバリクの西なのに、北や東に描かれていることもある。例えば唐とアッバース朝が戦ったことで知られるタラス川はビシュバリクの北東に描かれているが、実際には北西に位置する。また、インドとチベットの地理は、唐を訪れた仏教徒の巡礼(en)などでもたらされた中国側の情報に基づいている。現在のデリー、ダウラターバードなどインド西部の地名から、このあたりの情報はイルハン朝から得られたものと思われる。
トルキスタン西部、イラン高原、アラビア半島、エジプト、アナトリア半島の描写は正確で詳細である。ユーラシア北西部の地名はまばらにしか記載されていないのに、これらの地域の地名はとても詳しい。この範囲はイルハン朝と、イルハン朝に北隣するジョチ・ウルスの領域と一致することから、これらの情報もイルハン朝から得られたものと見られる。
アフリカには35ほどの地名が書かれている。アフリカの海岸線についてはヨーロッパのヴァスコ・ダ・ガマらの情報よりも早い。特に南端についての情報は正確で、オレンジ川と見られる川も描かれている。アフリカ中央部についてはほとんど省略されているが、14世紀前半まで存在していたエジプトのアレクサンドリアの大灯台が描かれており、エジプト（アラビア語では本来「ミスル」 مصر Miṣr）を領有していたマムルーク朝の首都カイロや、東アフリカの中心的都市で12世紀から16世紀までソマリア以南を支配したベルベル系といわれるファフルッディーン家政権の首都であったモガディシュなどの地名も見られる。地中海の形も正確に描かれているが、他の海（黒く描かれている）とは異なり、陸地と同じ色で表されている。マグリブ(アフリカ北岸)とイベリア半島は正確だが、ジェノバとヴェネツィアが描かれていない。ヨーロッパの地名は100以上書かれており、ドイツのラテン語表記Alemaniaを意図したAlumangiaなどが見られる。
中国の探検

この地図には、古代中国の探検記録の実績も盛り込まれている。紀元前126年、前漢の張騫は国境よりも西方を探検し、ソグディアナ、フェルガナの大宛、パルティア、大秦と呼ばれたローマ帝国などが調査されている。また、西暦5世紀、中国東晋時代の僧法顕は初めて陸路インド洋にまで行き、船でインドとスリランカを訪問した。その後も中国は海外遠征を続け、とりわけ8世紀にはイスラムにまで達していた。唐の作家段成式（803？ - 863年）(zh)は西暦863年の著作の中で、東アフリカのソマリランドにある現在のベルベラと思われるボバリでの奴隷貿易、象牙貿易、竜涎香貿易について記述していることでも知られている。かなり時代は下るが14世紀の汪大淵は、船長として地中海にまで航海してエジプトマムルーク朝やモロッコにも訪問した。
アフリカ、ヨーロッパ、中東の詳細
李恵宗

| 恵宗 李旵 |
| --- | --- |
 李朝
 第8代皇帝
国号:  大越
王朝:  李朝
在位期間:  1210年11月15日 - 1224年10月
都城:  昇龍（タンロン、現ハノイ）
姓・諱:  李旵
廟号:  恵宗
生年:  天資嘉瑞9年（1194年）
没年:  建中2年8月10日 （1226年9月3日）
父:  高宗
母:  安全皇后譚氏
后妃:  順貞皇后陳氏
元号:  建嘉 : 1211年 - 1224年
李恵宗（りけいそう、越：Lý Huệ Tông、在位：1210年 - 1224年）は、李朝の第8代皇帝。諱は旵（サム、越：Sảm）、また『元史』では昊旵と書かれる。第7代皇帝高宗の子。
経歴

治平龍応5年（1209年）、内乱によって父の高宗とともに都を追われた際、陳李・陳嗣慶によって皇帝に擁立されたことがある（『大越史略』）。翌年、父の死去で正式に即位したが、父同様に暗愚な人物で国政を顧みなかったため、外戚の陳守度に政治の実権を握られた。
建嘉4年（1224年）、皇位の簒奪を目論む陳守度によって廃され、自身の次女でわずか7歳の李昭皇を擁立される。建中2年（1226年）、邪魔者となった恵宗は、陳守度によって自殺に追い込まれた。
| 0 | 1 | 2 |
| --- | --- | --- |
| 先代高宗 | 李朝の皇帝第8代：1210年 - 1224年 | 次代昭皇 |
モナド (プログラミング)

関数型プログラミングにおいて、モナドはプログラムを構造化するための汎用的な抽象概念である。対応したプログラム言語では、ボイラープレート的なコードでもモナドを使って除去することが可能となる。これはモナドが、特定の形をした計算を表すデータ型と、それに関する生成と合成の2つの手続きを提供することによって実現されている。生成は任意の基本型の値をモナドに包んでモナド値を生成する手続きであり、合成はモナド値を返す関数(モナド関数)たちを合成する手続きである。
広い範囲の問題をモナドを使うことで単純化できる。例えば、Maybeモナドを使えば未定義値への対処が簡単になり、Listモナドを使えばリストに入った値を柔軟に扱うことができる。複雑に組み合わさった関数は、モナドを使えば、補助データの管理や制御構造や副作用を除去した簡単なパイプライン構造に置き換えることができる。
モナドの概念や用語は圏論から来ている。圏論においては、モナドは追加の構造を持つ関手として定義されている。1980年代の後半に研究され始め、1990年代前半には、一見無関係な計算機科学上の問題がモナドによって統一的で関数的にモデル化できることが分かってきた。圏論はモナドの満たすべき形式的な条件を与え、これはモナド則と呼ばれている。モナド則はモナド的なコードの形式的検証にも使用可能である。
ある種の計算では、その計算の意味をモナドで明確に表現できることを利用して、プログラム言語の便利機能の実装にモナドを使うことができる。Haskellのように、標準ライブラリですでに汎用のモナド構造といくつかのインスタンスを定義している言語もある。
歴史

プログラミングにおけるモナドの概念は1980年代のプログラム言語Opal (プログラミング言語)（英語版）に見られるが、このときは「コマンド」と呼ばれ形式化はされなかった[要出典]。
1991年にEugenio Moggiはプログラムの構造化でモナドを初めて汎用的に使用した。この成果を元に、Philip WadlerやSimon Peyton Jonesといったプログラム言語の研究者(二人ともHaskellの言語仕様に取り組んでいた)により実装が行われた。初期のバージョンのHaskellは問題の多い「遅延リスト」を用いた入出力を使っていたが、Haskell 1.3からは遅延評価により柔軟に合成可能なモナドによる入出力が導入された。
入出力に加えて、プログラム言語研究者とHaskellのライブラリ設計者は構文解析器やインタープリタにモナドを適用することに成功した。Haskellのdo記法に現れる性質から、モナドの概念はapplicative functorとarrowへと一般化された。
長い間、Haskellとその派生だけがプログラミングにおけるモナドの主な利用者であった。最近では、F#がコンピュテーション式または「ワークフロー」と呼ばれる機能を導入した。これは、命令型プログラムしか経験のないプログラマにもなじみやすい構文を使ったモナド的構成を提供しようという試みである。
動機付けと例

プログラム言語Haskellはモナドを多用する関数型の言語であり、簡単にモナドの合成ができるような構文糖衣を持っている。特に指定がない限り、この記事のコード例はHaskellで書かれている。
モナドの紹介として一般的なふたつの例 Maybe モナドと I/O モナドを取り上げる。もちろん、モナドはHaskellに限られたものではないので、JavaScriptでの Writer モナドの例もその次に扱う。
動機付けと例 > Maybeモナド

オプション型 Maybe a を考えよう。これは型 a の値をひとつ持つか、全く持たないかのふたつの状態を表現する型である。これらを区別するために、二種類の代数的データ型構成子を持つ。Just tはひとつの値tを保持し、Nothingは値を何も保持しない。
data Maybe t = Just t | Nothing
この型を使って検査例外の簡単なものを作ってみたいとする。計算の途中で失敗した場合は、残りの計算は飛ばして結果Nothingを返し、すべての計算が成功した場合は何か値xを保持したJust xを返すことにする。
以下の例では、addはMaybe Int型のふたつの引数を受け取って、同じ型の結果を返す。mxとmyがともにJustである場合は、これらの値の和をJustに入れて返したい。もし、mxとmyのどちらかがNoneだった場合は、Nothingを返したい。こういった振る舞いをする関数を単純に実装しようとしたら、「if Nothing then Nothing else Just xのxに何かする」の形の場合わけを複数ネストすることになり、すぐやっかいなものになる。
add :: Maybe Int -> Maybe Int -> Maybe Int
add mx my =
  case mx of
    Nothing -> Nothing
    Just x  -> case my of
                 Nothing -> Nothing
                 Just y  -> Just (x + y)
これを楽にするための、各計算を繋げる演算子を定義することができる。二項演算子 bind (>>=) は失敗する可能性のある計算の結果を、もうひとつの失敗する可能性のある計算へ連鎖する。最初の引数が Nothing だった場合は、二番目の引数(関数引数)は無視されて、単に計算全体が失敗する。もし、最初の引数が Just x だった場合は、この値 x は二番目の関数引数に渡されて、この関数の結果として新しい Maybe の値が返される。これは Just な値か失敗かのどちらかになる。
(>>=) :: Maybe a -> (a -> Maybe b) -> Maybe b
Nothing  >>= _  =  Nothing    -- 失敗した計算は Nothing を返す
(Just x) >>= f  =  f x        -- 値 x に関数 f を適用する
計算の状態に影響を与えずに値を投入する構築子は、Just がすでにそうなっている。
return :: a -> Maybe a
return x = Just x       -- 値 x を包んで、型 (Maybe a) の値として返す
これらを使うことで、上の例は次のように書ける。
add :: Maybe Int -> Maybe Int -> Maybe Int
add mx my =             -- (Maybe Int) 型のふたつの値を足す関数。各入力は Nothing の場合がある
  mx >>= (\x ->         -- mx が Nothing でない場合に、値 x を抽出する
    my >>= (\y ->       -- my が Nothing でない場合に、値 y を抽出する
      return (x + y)))  -- 値(x+y)を包んで、(Maybe Int)型の値として和を返す
さらにdo記法という構文糖衣を使うことで、次のように書くことができる。
add :: Maybe Int -> Maybe Int -> Maybe Int
add mx my = do
  x <- mx
  y <- my
  return (x + y)
この種の操作は頻出なので、Haskellの標準関数(liftM2)が用意されている。これはふたつのモナド的な値(ここでは、ふたつのMaybe)と、その中身(ふたつの数値)を組み合わせる関数(加算)を受け取る関数であり、上の例は次のように書ける。
add :: Maybe Int -> Maybe Int -> Maybe Int
add = liftM2 (+)
(上記のdo記法を使ってliftM2の定義を書いてみよう)
動機付けと例 > I/Oモナド

Haskellのような純粋関数型言語では関数が外部から観測可能な作用をもつことは、関数の意味から外れることになるため許されない。しかし、関数が直接副作用を起こすのではなく、求める副作用を記述する値を構築して返し、呼び出した側が適当な時に実行することは可能である。Haskellの記法では、型 IO a の値がこのようなアクションを表現していて、実行されたときには、型 a の何らかの値を生成する。
IO型の値は「現在の世界の状態を引数に取り、関数の返り値として変化した状態を持つ新しい世界を返す」という意味でアクションとみなすことができる。例えば、関数 doesFileExist と removeFile は次の型を持つ関数である。
doesFileExist :: FilePath -> IO Bool
removeFile :: FilePath -> IO ()
removeFile は関数としては、FilePath を引数にとり、ある IOアクションを返す。このアクションが実行されると世界を、この場合はファイルシステムを FilePath という名前のファイルの存在しないものに変更する。この場合は、IO の持っている値は () 型の値なので、なにも結果は生成されず、呼び出し側はこれを気にする必要はない。一方で、doesFileExist の場合は、関数の返す IOアクションはブール型の値、True または Falseを包んでいて、概念的には、アクションが実行されたときのファイルシステムに FilePath という名前のファイルが存在したかどうかを呼び出し側が知っているという世界の状態を表現している。アクションからアクションへと世界の状態を渡して管理するこの方法により、決まった順序で状態を変化させていくアクションの列を定めることが可能となる。この過程は時相論理において宣言的な命題のみで時間の経過を表現する手法と似ている。以下の例ではプログラム内のアクションを連鎖する方法の詳細を再び Haskell を使って明らかにする。
基本的な種類の入出力操作、標準出力に文字列を書く、標準入力から文字列を読む、ファイルの読み書き、ネットワーク越しのデータ送信等をすべて記述できるようにしたい。さらに、これらのプリミティブを組み合わせて大きなプログラムを作れる必要もある。例えば次のように書けることが望ましい。
main :: IO ()
main = do
  putStrLn "What is your name?"
  name <- getLine
  putStrLn ("Nice to meet you, " ++ name ++ "!")
この直観的な記法はどのように形式化できるだろうか？このためには各入出力アクションに対して、いくつかの基本的な操作を実行できる必要がある。
ふたつの入出力アクションをひとつにできなければならない。Haskellでは、中置演算子 >> を用いて、putStrLn "abc" >> putStrLn "def" と書き、コンソールに二行の文字列を表示するひとつのアクションである。演算子 >> の型は IO a → IO b → IO b であり、ふたつの入出力アクションを引数に取り、順番に実行するひとつのアクションにまとめて返す。
何もしないという入出力アクションも必要である。これは値を返すがなんの副作用も持たない。Haskellではこのアクションは return で構築され、この型は a → IO a である。
さらに、最初のアクションの結果に基づいて次に実行するアクションを決める必要がある場合がある。Haskellでは、演算子 >>= (bindと読む)を使い、型は IO a → (a → IO b) → IO b である。左側のオペランドは型 a の値を返す入出力アクションであり、右側のオペランドは左側のアクションの生成した値に応じて次に実行する入出力アクションを選択する関数である。結果は、最初のアクションを実行しその値を関数に渡した評価結果をアクションとして実行し、最後にこのアクションの結果を返す合成されたひとつのアクションとなる。
これらの3つの演算子をプリミティブな入出力操作として「いかなるプログラムでも」書けるかというのは、データ変換(ラムダ式使う)やif式やループを含めたとしても自明であるとは言いがたい。上の例は長い式を使って次のように書ける。
main =
  putStrLn "What is your name?" >> 
  getLine >>= \name ->
  putStrLn ("Nice to meet you, " ++ name ++ "!")
bind 演算子の持つパイプライン構造により、getLine と putStrLn の命令はそれぞれ一度だけ、書いた順序で評価され、入力ストリームから文字列を取り出して、出力ストリームに出力する副作用は関数型パイプラインの中でも正しく実行される。これは言語が関数をアウト・オブ・オーダー実行や遅延評価する場合でも成立する。
明らかに入出力の定義とMaybeの定義は共通の構造を持っているが、異なっている部分も多い。上述した構造や他のよくある似たような多くの構造の抽象化である。モナドの一般化された概念は、計算の一部が副作用を発生させるにもかかわらず、純粋関数的な計算として実行したくなるようなあらゆる状況を包含している。
形式的定義

モナドは、元となる型システムが与えられたとき、その内部に対応する型システム(モナド的型システムと呼ぶ)を埋め込む構成である(つまり、各モナド的型は元のシステムの型でもある)。このモナド的型システムは元の型システムの重要な点は全て保存するが、モナドに固有の特徴を追加する。
モナドは複数の方法で定義できる。そのうちの1つは「モナドとは、ある法則（モナド則）を満たす三つ組みである」 で表される定義である。すなわち圏論のクライスリ圏におけるクライスリトリプルである。
形式的定義 > 三つ組

三つ組は以下の要素からなる。
| 名前 | 別名 | 定義式 | 説明 |
| --- | --- | --- | --- |
| 型構築子M |  |  | 型 x から派生した別の型を得る（型から型を作る）演算子 |
| unit関数 | return | unit :: x -> M x  | 型 x の値を型 M x の値へうつす多相な関数 |
| bind関数 | >>= | bind :: M x -> (x -> M y) -> M y  | 型 M x の値、型 x の値を型 M y の値へ写す関数の2つから M y を得る関数 |
形式的定義 > 三つ組 > 型構築子M

class Monad M where
...
value :: M x
型構築子Mは、ある型 x から派生した型を得る方法を定める。得られる型はしばしば M x で表記される。
形式的定義 > 三つ組 > unit 関数

unit関数（ return とも）は型 x の引数を型 M x の返り値にうつす関数である。すなわちunit 関数は型 x の値をモナド型 M x の値へうつす多相な関数である。引数値変換の有無は定義されない（一般には値を変換せずに保持する（例:入力 1 =>出力 Maybe(1)）。
形式的定義 > 三つ組 > bind 関数

bind関数（ >>= とも）は「モナド的値」と「値をモナド的値へうつす関数」を引数にとり、第1引数のモナド的値を第2引数関数の値域へうつす。
形式的定義 > モナド則

三つ組 {M, unit（return）, bind（>>=）} をモナドと成す規則をモナド則という。以下がモナド則である。
return は >>= に対して、ほとんど単位元である。
(return x) >>= f   ≡   f x
m >>= return   ≡   m
ふたつの関数を続けて bind するのは、これらの関数から決まるひとつの関数を bind することに等しい。
(m >>= f) >>= g   ≡   m >>= ( \x -> (f x >>= g) )
公理を do 記法で表現することもできる。
do { f x }   ≡   do { v <- return x; f v }
do { m }   ≡   do { v <- m; return v }
do { x <- m; y <- f x; g y }   ≡   do { y <- do { x <- m; f x }; g y }
また、モナド合成演算子
(f >=> g) x = (f x) >>= g
を使うと
return >=> g   ≡   g
f >=> return   ≡   f
(f >=> g) >=> h   ≡   f >=> (g >=> h)
形式的定義 > fmap と join

Haskellではモナドを return と bind 関数を用いて定義するが、return にふたつの演算子 join と fmap を加えることでも定義可能である。この定式化は圏論における元のモナドの定義により近くなる。fmap 演算子は型 (t→u) → M t→M u を持ち、ふたつの型間の関数を受け取って、モナドの中の値に「同じこと」をする関数を返す。join 演算子は型 M (M t)→M t を持ち、二層になったモナド的な情報を平らにしてひとつにする。
ふたつの定式化は以下の関係を持つ。
fmap f m = m >>= (return . f)
join n = n >>= id

m >>= g   ≡   join (fmap g m)
ここで、m は M t、n は M (M r)、f は t → u、g は t → M v の型を持つ。t、r、u、v は元の型である。
モナドでなくても、型と関数からなる圏では fmap 関数は任意の函手に対して定義できる。函手は次の法則を満たす。
fmap id   ≡   id
fmap (f . g)   ≡   (fmap f) . (fmap g)
同じ圏で、return は基点付き函手（英語版）を特徴付ける。これは値を函手の中に「持ち上げる」ことによる。満たすべき法則は次の通りである。
return . f ≡ fmap f . return
さらに、join によってモナドが特徴付けられる。
join . fmap join     ≡ join . join
join . fmap return   ≡ join . return = id
join . fmap (fmap f) ≡ fmap f . join
形式的定義 > 加法的モナド

加法的モナドは、モノイド則を満たす二項演算子 mplusとその単位元としてモナド的な値 mzero を備えたモナドである。演算子 mplus の型は M t → M t → M t であり(ここで、M はモナドの構築子であり t は元の型である)、結合律と左右からの単位元律を満たす。
(a `mplus` b) `mplus` c   =   a `mplus` (b `mplus` c)
m `mplus` mzero           ≡   mzero `mplus` m           ≡    m
このことから、加法的モナドはモノイドでもある。>>=に対しては、mzeroはヌル要素として振舞う。ゼロを掛けるとゼロになるように、mzero と関数を bind すると結果はゼロとなる。
mzero >>= f               ≡   mzero
同様に、モナド的な値 m とつねにゼロを返す関数を bind すると、結果はゼロである。
m >>= (\x -> mzero)       ≡   mzero
直観的には、モナド的値としてのゼロはモナドに関連した構造だけを持ち元の型の値を持たない。Maybe モナドでは、「Nothing」がゼロである。リストモナドでは、空リストがゼロである。
構文糖衣: do記法

bind 演算子 >>= を直接使ってプログラムを書くのがよい場合もあるが、典型的にはdo記法 (OCamlでは perform記法、F#ではコンピュテーション式)を使用し、命令型言語のような見た目にできる。コンパイラはdo記法の式を >>= を使ったものに変換する。例えば
a = do x <- [3..4]
       [1..2]
       return (x, 42)
を変換した結果は以下となる。
a = [3..4] >>= (\x -> [1..2] >>= (\_ -> return (x, 42)))
リストモナドの実装を見てみよう。リストにマップを行い結合を行う(平らにする)この関数は concatMap とも呼ばれる。
instance Monad [] where
  m >>= f  = concat (map f m)
  return x = [x]
  fail s   = []
よって、以下のような変形が行われて、それぞれの式はすべて等価である。
a = [3..4] >>= (\x -> [1..2] >>= (\_ -> return (x, 42)))
a = [3..4] >>= (\x -> concatMap (\_ -> return (x, 42)) [1..2] )
a = [3..4] >>= (\x -> [(x,42),(x,42)] )
a = concatMap (\x -> [(x,42),(x,42)] ) [3..4]
a = [(3,42),(3,42),(4,42),(4,42)]
リスト[1..2]は使われないことに注意しよう。左矢印をつけないことで、連鎖した関数は引数を無視するように変換されて、値ではなくモナド的な構造だけが問題になることを示すことができる。例えば、状態モナドで値を生成せずに状態だけを変化させるようなときに使われる。do記法は >>= の単なる構文糖衣であるので、どんなモナドに対しても使うことができる。
Maybeモナドの値を安全に割り算する以下の定義も等価である。
x // y = do
  a <- x  -- xとyの中に値がある場合は取り出す
  b <- y
  if b == 0 then Nothing else Just (a / b)

x // y = x >>= (\a -> y >>= (\b -> if b == 0 then Nothing else Just (a / b)))
同様にF#ではコンピュテーション式を使うことができる。
let readNum () =
  let s = Console.ReadLine()
  let succ,v = Int32.TryParse(s)
  if (succ) then Some(v) else None

let secure_div = 
  maybe { 
    let! x = readNum()
    let! y = readNum()
    if (y = 0) 
    then None
    else return (x / y)
  }
このmaybeブロックは構文糖衣であり、以下の式に変換される。
maybe.Delay(fun () ->
  maybe.Bind(readNum(), fun x ->
    maybe.Bind(readNum(), fun y ->
      if (y=0) then None else maybe.Return(x / y))))
モナド的な汎用関数

安全な割り算の結果は、値が Nothing であるかを素直に確認せずに(つまり割り算の結果があるかを確認せずに)そのまま計算に使えたほうが便利なことがある。これは「持ち上げ（英語版）」関数を使うことで可能である。この関数は Maybe に限定されず、任意のモナドに対して定義される。Haskellでは LiftM2 と呼ばれる。
liftM2 :: Monad m => (a -> b -> c) -> m a -> m b -> m c
liftM2 op mx my = do
    x <- mx
    y <- my
    return (op x y)
関数型を示す矢印が右結合であることから、liftM2は2引数の関数を引数に取って、さらなる2引数の関数を返す。型シグネチャは m がモナドのとき、任意の2引数関数を「持ち上げ」ることができることを示している。例えば、
(.*.) :: (Monad m, Num a) => m a -> m a -> m a
x .*. y = liftM2 (*) x y
は演算子 (.*.) を定義し、それは引数がどちらも Nothing でないときに、掛け算した結果を返す(どちらかが Nothing の場合は Nothing を返す)。この方法の利点はモナドの実装に深入りする必要がないことである。他の同じような関数やモナドを使う場合でも、liftM2 を使うことで、やりたいことが鮮明になる(コードの再利用を見よ)。
数学的には、liftM2 は次のように定義される。
他の例 > 恒等モナド

もっとも単純なモナドは恒等モナドであり、値になんの情報も付加しない。
Id t = t
return x = x
x >>= f = f x
このモナドのdoブロックは変数の代入を実行する。例えば、do {x <- 2; return (3*x)} の結果は6である。
圏論的な見方をすると、恒等モナドは恒等函手の間の随伴から得られる。
他の例 > コレクション

リストや集合や多重集合といった、おなじみのコレクション型にもモナドであるものがある。リストの場合の定義は次のようになる。
-- "return" constructs a one-item list.
return x = [x]
-- "bind" concatenates the lists obtained by applying f to each item in list xs.
xs >>= f = concat (map f xs)
-- The zero object is an empty list.
mzero = []
リスト内包記法（英語版）はリストモナドに固有のもので、例えば、リスト内包 [ 2*x | x <- [1..n], isOkay x] はリストモナドでの計算 do {x <- [1..n]; if isOkay x then return (2*x) else mzero;} に対応している。
リスト内包記法は集合の内包記法に似ているが、集合はモナドにならない。なぜなら、計算の型は等しいかどうかを比較可能でなければならない — モナドは計算の型についてこれを課していないように見えるにもかかわらず — という制限があるからである。実際、集合は制限されたモナド(restricted monad)である。コレクションによるモナドは非決定計算を自然に表現する。リスト(または他のコレクション)は非決定的な計算の異なった実行パスが今の時点で取りうる結果の全体を表す。例えば、x <- [1,2,3,4,5] を実行したとすると、変数 x はこのリストから非決定的に選ばれた値であるとみなしている。xを返すことは、各実行パスの結果を値のリストにまとめることを意味する。さらに、bind 演算子では今の可能な結果に対して関数 f を実行し、それぞれの結果をひとつのリストに結合する。
if condition x y then return () else mzeroの形の文はよく現れる。条件が真である場合は何もしない計算を非決定的に選択し、意味のある値は返さない。一方で、条件が偽の場合は、選択肢の存在しない非決定な値 mzero = [] を返す。つまり、この実行パスを終了し、他の実行パスは走り続ける。これは条件を満たす特定の実行パスだけを通す「ガード」の役割を果たす。よって、コレクションモナドは論理パズルや数独などの問題を解く場合に役に立つ。
Haskellのように遅延評価を行う言語では、リストはその要素が必要になって初めて評価される。例えばリストの最初の要素を要求した場合は、最初の要素だけが計算される。非決定計算にリストモナドを使用した場合には、全ての計算からなる結果は非決定的に遅延リストとして生成され、最初の要素を要求すると、必要最小限の計算のみが行われて、最初の結果を返す。この過程はバックトラックに対応している。ある実行パスにいて計算に失敗した(mzeroに評価された)場合、最後に行った分岐までバックトラックを行い、そこから次のパスを選んで実行を続ける。二番目の要素が要求された場合、再びその答を得るのに必要な最小限の計算が行われる。よって、遅延評価の言語ではリストモナドを使って簡単にバックトラックを実装することができる。
圏論的な見方をすると、コレクションモナドは集合の圏とモノイドの圏の間の自由函手（英語版）と忘却函手の随伴から作られる。
| コレクションの種類 | モノイドの種類 |
| --- | --- |
リスト: モノイド
有限多重集合: 可換モノイド
有限集合: 冪等可換モノイド
finite permutation: 冪等非可換モノイド
他の例 > 状態モナド

状態モナドは状態を付加した計算の型である。好きな型に対して、その型を状態として持つ状態モナドを作ることができる。これは状態を引数に取り、通常の返り値(型 t の値)と新しい状態(型 s の値)を返す関数である。
type State s t = s -> (t, s)
今までに見たモナドと違い、状態の型という型引数を取ることに注意しよう。モナドの演算は次のように定義される。
-- "return" は状態を更新せず、受け取った値を生成する
return x = \s -> (x, s)
-- "bind" は m が変更した状態を f に渡して結果とする
m >>= f = \r -> let (x, s) = m r in (f x) s
状態を操作する関数を挙げる。
get = \s -> (s, s) -- 現時点での状態を見る
put s = \_ -> ((), s) -- 状態を上書きする
modify f = \s -> ((), f s) -- 状態を更新する
初期状態を指定して状態モナドを実行する関数。
runState :: State s a -> s -> (a, s)
runState t s = t s
状態モナドのdoブロック内の計算は状態の確認や更新を行うことができる。
非形式的に書くと、状態の型 S を持つ状態モナドは返り値の型 T を関数型   S\rightarrow T\times S に変換する。return は単に
であり、bind は
である。
圏論的な見方では、状態モナドはデカルト閉圏の定義に現れる積函手と指数函手の随伴から作られる。
他の例 > 環境モナド

環境モナド(Readerモナドや関数モナドとも呼ばれる)は環境を共有した計算を可能にする。型構築子は型 T を 関数型 E → T にうつす。ここで、E は共有したい環境の型である。モナド演算子は
で定義される。
環境を操作する関数として
がある。ask は現在の環境を取得するのに使う。localは指定した計算を一時的に変更した環境で行う。状態モナドと同様に、環境モナドによる計算は単に環境の値にモナドの値を適用することで実行できる。
他の例 > Writerモナド

Writerモナドは本来の計算を行いながら、様々な種類の追加の出力を作成することができる計算である。ログ取りやプロファイリングに有用である。元の型 T に対して、Writerモナドは型 W × T の値を持つ。ここで、W はモノイド則を満たす演算を持った型である。すなわち、W は二項演算子 (a,b) → a*b と単位元 ε を持っており、これは結合則 (a*b)*c = a*(b*c) を満たし、任意の x について、x*ε = ε*x = x を満たす。
モナド演算は
で定義される。ここで、εと * はモノイド W の単位元と二項演算子である。
JavaScriptではWriterモナドの値として2要素の配列を使うことができる。最初の要素は任意の値であり、二番目の要素は出力を貯めておくための配列である。
var writer = [ value, [] ];
角括弧はこのモナドの値コンストラクタとして使っていて、より単純な要素(配列の0番目は値、1番目にはログ配列)からWriterモナドの値を作っている。
unit (return はJavaScriptの予約語なのでこちらを使う)は元の値に空のログ配列をつけるだけである。
var unit = function(value) { return [ value, [] ]; };
bind は最初のWriterモナドの中の値に関数を適用し、それぞれのログ配列を結合して新しいモナドの値として返す。
var bind = function(writer, transform) {
    var value  = writer[0];
    var log    = writer[1];
    var result = transform(value);
    return [ result[0], log.concat(result[1]) ];
};
pipelineは補助関数で関数の配列を順番に bind する。
var pipeline = function(writer, transforms) {
    var result = writer;
    transforms.forEach(function (transform) {
        result = bind(result, transform);
    });
    return result;
};
モナドの値を返す関数の例を挙げる。
var squared = function(x) {
    return [ x * x, 'was squared.' ];
};

var halved = function(x) {
    return [ x / 2, 'was halved.' ];
};
最後に数学関数のパイプラインにデバッグ情報(デバッグ情報の配列は結合されて、値と一緒に返される)を追加する例を挙げる。
pipeline(unit(4), [ squared, halved ]); // [ 8, [ 'was squared.', 'was halved.' ] ]
他の例 > 継続モナド

結果の型  R の継続モナドは型  T を関数型  \left(T\rightarrow R\right)\rightarrow R にうつす。これは継続渡しスタイルのモデルとして使われる。return と bind 関数の定義は
である。
call-with-current-continuation（英語版）関数は次で定義できる。
他の例 > 他の例

研究者により発見されたモナドになる概念を挙げる。
Iteratee
例外処理
グラフィカルユーザインタフェース
プロセス間通信
構文解析器
インタープリタ
正格評価
他の言語で書かれたコードへのインターフェース