2025プログラミング言語論 IOモナド
Summary
TLDRこのオンライン講義では、プログラミング言語論における関数型プログラミングの概念、特にメイビー(Maybe)モナドについて詳しく説明されています。講義は40分の制限があり、出席登録のURLも提供されています。メイビーは、値が存在しない可能性を表現するためのモナドであり、エラー処理や関数合成の方法についても触れられています。
Takeaways
- 🖥️ プログラミング言語論のオンライン講義
- ⏳ 最大40分の制限
- 📋 出席登録のURL提供
- 🔍 メイビー(Maybe)モナドの説明
- ⚙️ 関数合成の重要性
- 🚫 エラー処理の方法
- 📚 関数型プログラミングの概念
- 💡 参照性と不変性の重要性
- 🗓️ 次回の授業は来週
- 📖 教科書の参照ページ
Timeline
- 00:00:00 - 00:05:00
録画が始まり、プログラミング言語論のオンライン講義が開始される。大学のライセンスの関係で最大40分のセッションであるため、途中で切れた場合は授業が終了することが説明される。出席登録のURLがチャットに共有され、受講者は出席がカウントされることが伝えられる。
- 00:05:00 - 00:10:00
前回の講義の内容を振り返り、メイビー・モナドについての説明が行われる。関数の基本的な概念が紹介され、メイン関数の重要性とその分割について説明される。関数合成の概念が紹介され、従来の手続き型プログラミングとの違いが強調される。
- 00:10:00 - 00:15:00
関数の参照性について説明され、数が常に同じ値を持つことの重要性が述べられる。汚れた変数の問題が指摘され、関数型プログラミングにおけるイミュータブルとミュータブルの概念が紹介される。具体的な例として、0による除算の問題が挙げられ、エラー処理の方法が説明される。
- 00:15:00 - 00:20:00
プログラミング言語におけるエラー処理のポリシーの違いが説明され、例外処理の重要性が強調される。例外が発生した場合のプログラマーへの通知方法についても言及され、数値計算におけるエラー処理の方法が紹介される。
- 00:20:00 - 00:25:00
メイビーの概念が具体的に説明され、関数の定義とその戻り値についての考え方が示される。値コンストラクターの使用が強調され、メイビー型の具体例が示される。配列との類似性についても言及され、プログラミング言語設計の観点からの考察が行われる。
- 00:25:00 - 00:33:18
最後に、バインド演算子を用いた関数の合成方法が説明され、IO型の変数を扱う際の注意点が述べられる。具体的なプログラム例が示され、次回の授業についての案内が行われる。
Mind Map
Video Q&A
この講義のテーマは何ですか?
プログラミング言語論に関するオンライン講義です。
メイビーとは何ですか?
メイビーは、値が存在しない可能性を表現するためのモナドです。
この講義はどのくらいの時間ですか?
講義は最大40分間です。
出席登録はどのように行いますか?
出席登録のURLがチャット欄に提供されています。
次回のオンライン授業はいつですか?
次回のオンライン授業は来週の同じ時刻に行われます。
View more video summaries
2025プログラミング言語論 Maybeモナド
2025プログラミング言語論 クロージャ
2025プログラミング言語論 逐次実行・条件分岐・繰り返し
一口气看完系列《鬼灭:开局跟甘露寺提亲》穿越了自己的相亲对象竟然是甘露寺蜜璃相亲!等等,那这里岂不是鬼灭之刃的世界!?#鬼滅の刃#有声漫画#爽文#无敌#穿越
【スターゲートがAIの利用爆増を支える】オープンAI・アルトマンCEO/トランプ氏は直感で良い判断を下す/1時間で100万ユーザー増「ジブリ風」画像生成で浮上した課題/発端はサプライチェーンの限界
【仕事は食われるがコンサルは足りない】アクセンチュアAIセンター長・保科学世/「リスキルが必要な社員39%」もAIが算出/プレゼン資料を“秒”で作る極秘AIをデモ公開【CROSS DIG 1on1】
- 00:00:00をしておきます。録画始まったかな?はい
- 00:00:03。え、改めて、えっと、プログラミング
- 00:00:06言語論の、え、オンライン講議になります
- 00:00:11。で、えっと、大学のライセンスの関係で
- 00:00:15、えっと、ね、最大ね、40分しか、あ、
- 00:00:20Zoom
- 00:00:22があの、セッション開けないので、もしね
- 00:00:25、途中で切れちゃったらもうそこで授業
- 00:00:28終わり。ま、今日は終わりにします。え、
- 00:00:31途中で切れちゃったらもうそこまで、え、
- 00:00:33ということにします。ま、できるだけね、
- 00:00:36あの、知り切れトンボにはならないように
- 00:00:38時間見ながら、あ、やりたいと思います。
- 00:00:41念のため先に出席登録のURLをチャット
- 00:00:44欄の方にあげておきましたので、えっと、
- 00:00:49ま、もし切れちゃっても、ま、今日は今日
- 00:00:51来てくれたら出席はカウントします。
- 00:00:55えっと、画面共有。画面共有どっちかな?
- 00:01:00こっちかな?はい。えっと、
- 00:01:06前回ね、録画
- 00:01:09講議したあと
- 00:01:13あ、連続しているので、え、その話から
- 00:01:19あのもう1度入っていきます。あ、これ
- 00:01:22画面全部共有してるやん。ダメやん。もう
- 00:01:251回画面全部じゃない。これ
- 00:01:29はい。え、これです。あの、メイビー
- 00:01:33モナドという話をしました。教科書で言う
- 00:01:37と、えー、教科書で言うと、おほほ、
- 00:01:44メイビーはどこに出てきてたかな?
- 00:01:51メイビーというう
- 00:01:53、
- 00:01:58目次にメイビー
- 00:02:01がないかな。153ページの監守のところ
- 00:02:05にある。
- 00:02:07えっと、インデックスでメイビで見ると
- 00:02:13、え、メイビ96ページ113ページです
- 00:02:17ね。
- 00:02:2196ページはあんまり参考にならない。
- 00:02:2463ページカウントダウン問題のところに
- 00:02:29えっと載ってるこれ113ページのところ
- 00:02:34本当かメイ
- 00:02:4013ページのところに出てるのかな。ま、
- 00:02:43えっと、監守友などのところに、えっと、
- 00:02:49詳しい説明が載っていますが、ま、その
- 00:02:53中身を教科書ね、若干難しく書いてあるの
- 00:02:57で、えっと、補いながら、あの、話を進め
- 00:03:00ていきます。えっと、まず関数というのが
- 00:03:03どんなものだったかって言うと、ま、値を
- 00:03:06受け取って値を返すというね、これが関数
- 00:03:08でした。で、え、
- 00:03:122のプログラムというのは要するにこう
- 00:03:14関数なわけですよね。メイン関数なわけ
- 00:03:17ですよね。ただいきなりメイン関数1個
- 00:03:20ポンとか書けるかって言うと、ま、2つ
- 00:03:22問題があって、1つはそのメイン関数が
- 00:03:24大きすぎる。だから適切な部分問題に、
- 00:03:27部分関数に、え、分けてあげなきゃいけ
- 00:03:31ないのと、分けたものを合成しなきゃいけ
- 00:03:33ないということが起こります。で、どう
- 00:03:36合成するかっていうのが、えっと、ま、
- 00:03:40PYONとかだとね、順番に書いていくと
- 00:03:42か、あ、制御構図を使うとかなんですが、
- 00:03:46あ、数学では一般的にこれ関数合成を使い
- 00:03:49ます。で、ハスケルというか、ま、関数型
- 00:03:52プログラミングにおいても、え、関数は
- 00:03:55関数合成を使って、え、1つの関数に
- 00:03:58くっつけていく。で、えっと、それが、ま
- 00:04:02、Pythonとかの従来型の手続き型
- 00:04:05プログラミングと違うのは、あ、制御構造
- 00:04:09そのものもこの関数合成の中に含まれて
- 00:04:13いるということです。で、もう1つの問題
- 00:04:17というのが、え、関数が、えっと、これ、
- 00:04:22あの、あ、ごめんなさい。数というのが3
- 00:04:24等下性と呼んでて、いつ見ても値が同じで
- 00:04:28あることを保証したい、担保したいという
- 00:04:31ことなんですね。えっと、Xの値がある日
- 00:04:35は1だったけれど、次の日は2だったとか
- 00:04:37いうことはやめたいいうわけですよね。で
- 00:04:40、それをXな値が変化しないこと保証して
- 00:04:44あげることで、ま、人間の思考様式に非常
- 00:04:47にこう近い
- 00:04:49プログラミングができるようになるという
- 00:04:51発見があって、これが参照性と呼ばれる
- 00:04:53性質でした。ただしプログラムというのは
- 00:04:56いろんな意味で例えばユーザーの入力
- 00:04:59受け付けなければいけないし例外的な状況
- 00:05:02というのも起こりうるわけで参照というの
- 00:05:05はいつも担保するわけにはいかない。
- 00:05:08こんな風に、え、汚れた変数ですね、3照
- 00:05:11じゃない変数が紛ることがあるので、それ
- 00:05:14を、ま、分離したいということが、あ、ま
- 00:05:18、関数型プログラミングに求められます。
- 00:05:21で、これは最新のプログラミングである、
- 00:05:24ま、スフトとかラストとかあ、にもこの
- 00:05:27考え方は取り入れられています。え、
- 00:05:31イミュータブルとミュータブルっていう
- 00:05:33キーワードで調べてもらうと例えばラスト
- 00:05:37なんかではもうそのままそのキーワードと
- 00:05:40して、え、使われています。ま、具体例を
- 00:05:43上げるとあの0による助山っていうのが、
- 00:05:47ま、プログラミングでは、ま、避けたい
- 00:05:49わけですよね。数学でももちろん避けたい
- 00:05:51し、え、プログラミングでもゼロ上山と
- 00:05:54いうのは定義されてないので、
- 00:05:57これは実行したくないわけですね。
- 00:05:59Pythonでもし実行するとこんな風に
- 00:06:010ディビジョンエラーというエラーが発生
- 00:06:04します。で、これをプログラミング言語、
- 00:06:07プログラミング環境によってはどういう風
- 00:06:10にハンドリングするかってポリシーの違い
- 00:06:12があって、えっと、あ、ま、これあの録画
- 00:06:15講義の復習なので、もうあの理解したと
- 00:06:19いう人はね、あの後で戻ってきてもらって
- 00:06:21結構ですが、ま、ま、ま、一応は聞いて
- 00:06:23ください。え、プログラム以上終了させる
- 00:06:26先ほどのPYONの例もそうですね。で、
- 00:06:28ま、これは、あ、最近の、最近で、ま、
- 00:06:31ここ20年ぐらいのプログラミング
- 00:06:33スタイルでは例外を発生させてるなので、
- 00:06:36プログラマーが例外をキャッチできる
- 00:06:38Javとか、あ、PYONもそうですね、
- 00:06:41C++もそうですね。え、例外がキャッチ
- 00:06:43できる気構
- 00:06:46を設けてることが多いです。ただ、ま、
- 00:06:48例外キャッチしたところでね、じゃあ元の
- 00:06:50プログラム戻れるかって言うとゼロ上山
- 00:06:52発生してる時点でもう詰んでるので、え、
- 00:06:55ま、せいぜね、ユーザーにどういう風に、
- 00:06:57えー、例外を見せるか、エラーを伝えるか
- 00:07:01ぐらいの選択肢しかないことが、え、多い
- 00:07:04ですが、ま、勝手に終了するよりはマしと
- 00:07:07いうことでしょうかね。あの、よくね、
- 00:07:12あの、アプリケーション使ってるとなんか
- 00:07:15塗るポインター、あ、例外とかがね、画面
- 00:07:19にボーンって出てきて、これどうしろって
- 00:07:21言うんだって、もう起こるじゃないですか
- 00:07:22。もうそれと同じことですよね。ユーザー
- 00:07:25に例を知らせても、ま、あまり嬉しいこと
- 00:07:28はないけれども、ま、しないよりはマしい
- 00:07:30ということですかね。え、もう1つが、ま
- 00:07:34、あの、ゼロ所算起こってしまった場合に
- 00:07:36はね、このどうしようもないんですけれど
- 00:07:38も、ま、それをプログラマーにどう伝える
- 00:07:41か、ユーザーではなくプログラマーにどう
- 00:07:43伝えるかという例外1つの方法だし、え、
- 00:07:46あるいは数よりも広い集合を使って
- 00:07:50プログラマーに伝える
- 00:07:53ということもできます。で、これは実際に
- 00:07:55使われてる例として、えー、ま、
- 00:07:58インフィニティというのがこれがあのIT
- 00:08:00トリプ動数点に定義されてますから
- 00:08:03インフィニティあるいはノットナンバーと
- 00:08:05いうのが定義されていますから、ま、その
- 00:08:07どちらかを使うという方法も、え、あり
- 00:08:11ます。えっとね、0助算の場合はノットア
- 00:08:14ナンバーにするのが主流だと思いますが、
- 00:08:19うん、ひょっとしたらインフィニティに
- 00:08:21なる処理系もあるのかもしれない。で、
- 00:08:24ただこれは、あ、えっと数値計算のエラー
- 00:08:30の時にしか使えなくて、もっとこう汎用的
- 00:08:33な枠組を使いたいというのが、あ、ま、
- 00:08:36関数型プログラミングにおける同機になっ
- 00:08:40ています。汎用的な枠組というのをこれ
- 00:08:43から見ていきます。そ、それが1つが
- 00:08:44MayイBですね。はい。1÷0という0
- 00:08:48に対して例えばこういう関数を定義したと
- 00:08:50しましょう。fx=1÷xと定義したとし
- 00:08:54ましょう。お、そうするとこれハスケルで
- 00:08:58書くとこういう風に書けるんですが、え、
- 00:09:01これxに0が渡されるとまずい。まずいの
- 00:09:04で、ま、こういう風な、あ、ガードをつけ
- 00:09:08てあげる。の、え、x=0であれば0で
- 00:09:12なければよ。で、もしも0だった場合には
- 00:09:16、え、これ特別な、あ、数でないもの、
- 00:09:20これナッシングと呼びますが、ま、
- 00:09:22ナッシングを返してあげるという考え方が
- 00:09:24できる。ただしで、数学者はこれで十分な
- 00:09:28んだけれども、え、プログラマーとしては
- 00:09:31モドリッチの方何ですかと、これ整数です
- 00:09:35か?ま、整数実ともナッシングを含む実数
- 00:09:38ですか?ナッシングを含む実数だとしたら
- 00:09:41実数が入ってのおかしいですよね。という
- 00:09:43ことで、これはこのちょっと括でくるんで
- 00:09:47あげます。え、これ具体的に何をしてるか
- 00:09:49と言うと、これ値コンストラクターという
- 00:09:52ね、オブジェクト思考でいう
- 00:09:53コンストラクターとよく似た考え方で、値
- 00:09:56コンストラクターというもので包んであげ
- 00:09:58ます。え、そうするとこの値
- 00:10:01コンストラクターを含んだもの、実数
- 00:10:04あるいはナッシングを含めたもの、これに
- 00:10:07対して1つの型というのが決まるので、え
- 00:10:10、こう裸の実数ではなくて、この値
- 00:10:13コンストラクトで包んだものを返しますよ
- 00:10:15と。で、その実数と実数の値
- 00:10:18コンストラクトされたものとナッシングを
- 00:10:21含めた集合が、あ、この完成エフェスの型
- 00:10:24になりますよということになります。で、
- 00:10:28その方具体的には、え、ハスケルでは
- 00:10:31メイビーという風に呼びます。
- 00:10:33メイビーフロートですね。メイビーという
- 00:10:35のは、あ、任の方にくっつくことができて
- 00:10:37、メイ、え、例えばメイビダブルとか
- 00:10:40インドとか使う、作ることが、え、でき
- 00:10:43ます。これはあと
- 00:10:46スフト言語であればオプショナルという、
- 00:10:50えーかええ方になります。オプショナル
- 00:10:53エイントとかオプショナルフロートとかあ
- 00:10:55使えますがハスケルではメイという、え、
- 00:10:59方が使われます。そして値
- 00:11:02コンストラクターはメイビの場合は
- 00:11:04justという値コンストラクターを使え
- 00:11:07ます。ジャスト1÷Xで違えばナッシング
- 00:11:10を返す。え、ノットイコールはこんな書き
- 00:11:12方をしますね。え、ノ=0であれば、え、
- 00:11:16ま、実際にはね、あの、不動症数投資の
- 00:11:18比較ですから、え、0.001とか渡さ
- 00:11:22れることがあるから、ま、これは疑似
- 00:11:23コードのようなもの、ま、実用性はないと
- 00:11:26思ってください。あの、実際にはね、非常
- 00:11:28に小さな数で割算を起こす、あの、すると
- 00:11:31、え、大きな誤差変えるので、実用的科学
- 00:11:35計算ではこういうことはやらないんだ
- 00:11:36けれども、ま、そのコンセプトを表すこと
- 00:11:40としてはこんな風にジャスト1÷
- 00:11:43かナッシングを返すということにします。
- 00:11:45そうするとfxというのはフロートを
- 00:11:47受け取ってメイフロートを返すという風に
- 00:11:49綺麗に書くことがあ、できます。え、お
- 00:11:52さいをするとfxという関数はナッシング
- 00:11:56を返すかあるいはジャスト1÷xを返すか
- 00:12:00あということになるんですが、これが実は
- 00:12:03あの非常にそっくりな考え方がもう1個
- 00:12:05あってそれが何かって言うと、え、配列
- 00:12:10でした。配列も、えっと、同じことが
- 00:12:14できるんですね。これメイじゃなくて配列
- 00:12:17だと思っても1/xというリストをの1
- 00:12:20要素のリストを返すか1要素の配列を返す
- 00:12:23か空っぽの配列を返すかということがあて
- 00:12:27実際にこういう風にかけます。えー下の方
- 00:12:30ですね同じようにかけます。え、正しい国
- 00:12:32がメイフロートではなくて配列リスト
- 00:12:35フロートリストオブフロートになっている
- 00:12:37ということ。同じことができます。え、と
- 00:12:40いうことは、ま、メイビーなくても配列で
- 00:12:42もいいんだけれども、ま、配列だとね、え
- 00:12:45、2要素、3要素、4要素っていう曖昧さ
- 00:12:48が残るので、
- 00:12:51え、ま、通帳はあのプログラムに意味を
- 00:12:54持たせる意味でもプログラマーの意図を
- 00:12:56伝える意味でもメイビーを使うんだけれど
- 00:12:58も、お、ということはここで、え、言語
- 00:13:02設計者としては、ま、僕は言語設計者じゃ
- 00:13:05ないけども、あの、こうハスケロ設計者
- 00:13:08たちは、え、これメビとフロあの配列って
- 00:13:12実は同じ枠組じゃないのっていう風に
- 00:13:15気づくわけですね。え、つまり
- 00:13:19共通の、え、クラスが、あ、共通の文脈、
- 00:13:25え、なんていう共通の背景があるで、えっ
- 00:13:28と、JavとかPythonの
- 00:13:31プログラマーだったら、じゃあ上位クラス
- 00:13:32を1個規定クラスとベースクラスを作り
- 00:13:35ましょうって話になるんだけれども、ただ
- 00:13:38この書き方は、えっと、クラスのクラスに
- 00:13:41なるので、ま、普通のオブジェクト思考
- 00:13:43言語では、あ、作れません。え、C+だと
- 00:13:49テンプレート、クラステンプレートという
- 00:13:50考え方で似たことができますがうん。ま、
- 00:13:55ま、ちょっと苦しい書き方にはなります。
- 00:13:58もちろん僕も書いてみたことありますが、
- 00:14:00あんまり読みやすいとは言えなかったです
- 00:14:02ね。で、ま、それが、あ、言語にビルト
- 00:14:06インして、え、おこうという風に設計され
- 00:14:09たのがハスケルの考え方で、え、この
- 00:14:14クラスを就職するものですね。え、これが
- 00:14:19、ま、メイビーなのかリストなのか、ま、
- 00:14:21その基本となる、その共通の基盤となる
- 00:14:26ものを設計し、え、されています。これが
- 00:14:30何かと言うと、えー、ファンクというもの
- 00:14:35ですね。え、ちょっとこれはあの前回の
- 00:14:38スライドなので飛ばしていきますね。え、
- 00:14:40飛ばしていきますね。え、ファンクターの
- 00:14:44説明はここら辺かな。あ、で、ファン、あ
- 00:14:48、これ関数合成の話ですね。えっと、
- 00:14:54これを、こういう風に、えっと、値
- 00:14:56コンストラクターを使って、え、値を返す
- 00:15:00というもの。それからこれが普通の関数
- 00:15:02ですね。これ、こっちはファンクター付き
- 00:15:04の関数、えっと、戻り値がファンクター
- 00:15:07付きの実数になっている。正確とメイビー
- 00:15:11beフロートになっている。メイは
- 00:15:13ファンクタの一種で、え、こっちは
- 00:15:16フロート受け取って、フロートを返す。
- 00:15:17実数受け取って実数を返す。普通の関数に
- 00:15:20なっている。で、え、これを混ぜる、これ
- 00:15:23を合成するにはどうしたらいいか。つまり
- 00:15:25こっちは変数を汚染するかもしれないんだ
- 00:15:28けれども、こっちは変数汚染しない。え、
- 00:15:31という場合にこのファンクタの考え方数学
- 00:15:34から借りてくると、あの、実はシンプルに
- 00:15:36書くことができて、え、それはどうする
- 00:15:39かって言うと、まずこのgxと関数を考え
- 00:15:43ますと。で、これは、えっと、値
- 00:15:46コンストラクターに戻り位置を入れる。
- 00:15:48戻りが値コンストラクターに入る。え、
- 00:15:51これはGXそのまま使ってるだけですよね
- 00:15:53。で、え、つまりジャストGXを返す。で
- 00:15:57、これを使うと何かこう合成する、関数
- 00:16:00合成する関数持ってくれば良いだけになり
- 00:16:04ます。なぜかと言うと、Fというのは、え
- 00:16:08、値何もついてないフロート受け取って、
- 00:16:13何もついてない実数受け取って、メイビ
- 00:16:15実数を返す。メイビフロートを返す。で、
- 00:16:19え、gプxも何もないx受け取って、え、
- 00:16:22ただの実数受け取ってメイ実数を返す。
- 00:16:26つまり同じ型なんですね。fxとgxは
- 00:16:29同じ方。あ、というか、fとgプは同じ型
- 00:16:33、同じ方同士なので合成ができるでしょう
- 00:16:36という風に考えます。え、この、え、白丸
- 00:16:40の関数合成子、これは、えっと、ハスケル
- 00:16:45に組み込まれ、ま、組み込まれ、標準
- 00:16:48ライブラリーにあります。それが何かと
- 00:16:51言うと、えっと、まずちょっと書く順番を
- 00:16:54変えます。えっと、こっちだとxにfが
- 00:16:59作用して次にgプライムが作用したんだ
- 00:17:01けれども、それを順番を変えてxにfが
- 00:17:05採用してgプムが作用するという風に向き
- 00:17:07を変えてあげます。え、次にFは、えっと
- 00:17:12、X身のX受け取って、え、メイフロート
- 00:17:18返すんだけれども、Gプレムもそうですね
- 00:17:20、生身のX受け取ってメイフフロート返す
- 00:17:22んだけれども、お、メイフロ、FからGへ
- 00:17:27の合成っていうのはメイフロートを受け、
- 00:17:30えっと、メイフロート返す関数をフロート
- 00:17:33受け取る関数で繋がないといけないので、
- 00:17:35こういう記号で表します。あの、丸じゃ
- 00:17:39なくてね、え、なんでかって言うと、
- 00:17:43この左辺、左辺と第1項か、第1項には、
- 00:17:46あ、メイビーフロートが来て欲しい。で、
- 00:17:48メイビーフロート作るにはここにもう
- 00:17:50ジャストというコンストラクター使えるの
- 00:17:52で、値コンストラクター使えるので、こう
- 00:17:55かければいいやんという風になって実は
- 00:17:58これそのまんまハスケルで書けます。え、
- 00:18:01それがこの書き方で、え、ジャスト2で、
- 00:18:05え、これをバインドという演山子ですね。
- 00:18:08先ほどの、え、この矢印のことをバインド
- 00:18:12と呼びます。で、バインドを使うと関数
- 00:18:15適用と関数合成が同じ、え、演山子で書く
- 00:18:21ことができる。え、というのがこの
- 00:18:26ファンクターの肝になり、ま、正確に言う
- 00:18:29とこれモナドと呼ぶんですが、あ、ま、
- 00:18:32ファンクタ、あのという風に、ま、
- 00:18:36ちょっと厳密性を書いた言い方ですが、ま
- 00:18:38、ファンクタと呼んでいます。正確には
- 00:18:40モナドの、え、バインド
- 00:18:43です。え、こんな風にして、
- 00:18:47えー、
- 00:18:48値コンストラクターを読んであげて、え、
- 00:18:51そして、えっと、バインドで関数適用、え
- 00:18:55、バインドで関数合成と、そうすると数字
- 00:18:59がFを通ってgプライムを通って、で、F
- 00:19:02というのはここで、え、ナッシングに
- 00:19:04落ち込むかもしれないという、う、0ロ上
- 00:19:08起こすかもしれないという、あの、条件
- 00:19:11分岐のある関数です。で、え、Gプライム
- 00:19:14というのは純粋に、え、Gという、え、
- 00:19:17フロート受け取ってフロート返す関数から
- 00:19:19、あ、値コンストラクのだけのピュアな
- 00:19:22関数ですよと。そういった関数もこうやっ
- 00:19:25て混ぜることができるというのがこの
- 00:19:28バインド演山子の力、サンクタの力という
- 00:19:31ことに、え、なっていました。でだ、でだ
- 00:19:35。えっと、
- 00:19:39えっと、ちょっともう1個画面共有をする
- 00:19:42と、あれ、画面共有のボタンどこ行った?
- 00:19:44どこ行った?えっと、ちょっと合わせて
- 00:19:47いるのは実はその40分縛りの結構きつい
- 00:19:50というのを今頃、今頃気づき始めていて、
- 00:19:56で、えっと、今の話をグラフィックで、え
- 00:19:59、説明するとこれはね、えっとね、
- 00:20:02ウェブサイトがあります。えっと、
- 00:20:05Funターズアプリカブズ
- 00:20:07&モナズinピチャーズという
- 00:20:09ウェブサイトがあります。そこから借りて
- 00:20:12きたもので、えっと、
- 00:20:16ラッの方にね、あのURL共有あのこちら
- 00:20:19の録画が仕上がったら、えっと、共有をし
- 00:20:22ておきます。
- 00:20:25はい。あと時間切れになる前に言っとくと
- 00:20:28、あと1回オンライン授業が、えっと、
- 00:20:31あります。来週のね、同じ時刻にあと1回
- 00:20:34オンライン授業があります。あの、来週も
- 00:20:36オンラインで、え、実施をします。えっと
- 00:20:40ね、あの、皆さんどこで受行してるか
- 00:20:41わかんないけれども、えっと、
- 00:20:45ま、もし他のね、あの、授業とか試験とか
- 00:20:48、あの、なければできるだけ涼しい場所で
- 00:20:51、あの、自宅でも大学でも結構ですが、
- 00:20:53涼しい場所で、え、受行をしてください。
- 00:20:57あと1回で次で最後です。で、えっと、今
- 00:21:01の話ね、えっと、2という数字があったと
- 00:21:04して、で、これに、ま、普通の何も、えっ
- 00:21:08と、汚染のない関数を例えばプラ3という
- 00:21:12のはね、これ3を足すという関数ですが、
- 00:21:143を足すと5になると、ま、これは
- 00:21:16目でたし、目でたしなんだけれども、お、
- 00:21:19ただその0助算とか何らかのエラーが
- 00:21:22起こる可能性がある時、これは値
- 00:21:24コンストラクターを使ってこうやって箱に
- 00:21:27入れる。ま、あ、コンストラクトさっきは
- 00:21:29この、え、かこでくるみましたけれども、
- 00:21:32ま、箱に入れるで、箱に入れるのなんで
- 00:21:34かって言うと、同じ箱でナッシングの可能
- 00:21:37性がある。ま、エラーを表すナッシングの
- 00:21:39可能性がある。で、そうするとこの箱に
- 00:21:41入ったものに、えっと、
- 00:21:45普通のフロートなり、普通の実数を
- 00:21:47受け取る関素を適用することはできないの
- 00:21:49で、あ、ウチってなってるわけですよね。
- 00:21:51で、じゃあどうするのって言うと、え、
- 00:21:55先ほどの、えっと、先ほどはあの、え、
- 00:21:58なんだ、え、大なり、大ナなりイコールと
- 00:22:02いう記号を使いましたが、えっと、正確に
- 00:22:05言うとファンクタ
- 00:22:07の場合にはFAPという関数を使う必要が
- 00:22:10あります。FAPという関数を使うと、え
- 00:22:13、この箱の中に作用することが、あ、
- 00:22:16できる。で、このFマapって何をする
- 00:22:18かって言うと、箱の中身から数値を
- 00:22:21取り出して、中身取り出して関数適用して
- 00:22:24、また箱に戻すということで、え、F
- 00:22:27マップを使うとナッシングの場合は何もし
- 00:22:30ないでナッシングを返すというで、箱に
- 00:22:33あの入れたものは決して箱から出さないと
- 00:22:37いうところが汚染されたものを決して触れ
- 00:22:40させない。3照性が担保されていないもの
- 00:22:43は参照性が担保されてるものと混ぜないと
- 00:22:46いうことで、その混ぜないという
- 00:22:48メカニズムをこのFマップという、え、
- 00:22:52関数に
- 00:22:54隠してる。で、Fマプと先ほどの矢印と
- 00:22:57バインド演山子と同じ
- 00:23:00意味です。あの、ちょっと違うんだけども
- 00:23:03意味は同じです。えっとで、Fマッapっ
- 00:23:06ていうのは、えっと、この、ま、やりまし
- 00:23:09たね、マップってやりましたね。配列に
- 00:23:11それぞれのあの、えっと、関数、1個の
- 00:23:14関数を配列のそれぞれの要素に、え、作用
- 00:23:17させるというのをマップですが、これ全く
- 00:23:19同じことで配列から取り出さずに配列の
- 00:23:22中身に関数を適用するということなので、
- 00:23:25え、これは、え、マップとFマップという
- 00:23:28のは配列に関してリストに関して言えば
- 00:23:31同じことでした。え、それからFマッって
- 00:23:35いうのは、えっと、こんなこともできます
- 00:23:38よと、つまり関数を合成することもできる
- 00:23:42んですよということですね。ここら辺は
- 00:23:46あの、ごめんなさい。こっちですね。えっ
- 00:23:49と、ここら辺ちょっと説明省略します。で
- 00:23:52、なんでかって言うと、実際FAPだけで
- 00:23:55はできないことがあって、それが何かって
- 00:23:57言うと、お、その
- 00:24:00メイビーを作り出すような、え、例外的な
- 00:24:03状況が起こりうる関数を合成するって
- 00:24:06いうのがFAPではできないことなので、
- 00:24:09え、そこで、えっと、モナドという考え方
- 00:24:12を使います。え、これは、えっと、こんな
- 00:24:16関数があるとしましょう。先ほどの関数
- 00:24:19ですね。え、実数を受け取って、え、
- 00:24:22ナッシングを返すかもしれない。実数を
- 00:24:24受け取って、え、この値コンストラクトさ
- 00:24:27れた、ラップされた実をすかも、返すかも
- 00:24:31しれない。メイビー実数を返すかもしれ
- 00:24:32ない。で、そうするとこのラップされたあ
- 00:24:36、実数を今度受け取ることができないので
- 00:24:40、ここをつぐ関数さっきのバインドですね
- 00:24:43。
- 00:24:44を作ってあげると、えー、これが、ま、
- 00:24:48ハッピーになれるよということです。
- 00:24:50えっと、中身を取り出して、えー、関数に
- 00:24:54通してまたラップして返してあげるという
- 00:24:57関数。これバインド関数ですね。で、
- 00:24:59ナッシングが来た場合にはナッシングを
- 00:25:01通す。で、こうするともう関数を影響に
- 00:25:04くっつけていけるので、えっとん、これで
- 00:25:08制御構造というものが、あ、関数合成で
- 00:25:11表現できるんだということです。で、もう
- 00:25:16ちょっとあと5分ぐらいしか多分時間が
- 00:25:19ちょっと早めにあの接続開始したのでその
- 00:25:22分時間削られてると思うので、え、あと5
- 00:25:25分ぐらいで説明をして自習に続けたいと
- 00:25:29思います。えっと、ちょっとね、実演し
- 00:25:33たかったんだけど、その時間がないかも
- 00:25:34しれないんで、その場合はちょっと申し訳
- 00:25:36ない。えっと、Xという変数があったとし
- 00:25:39ましょう。これはストリング型、文字列型
- 00:25:42とします。で、Xはハローワールドとし
- 00:25:45ましょう。で、そでメイン関数ね、
- 00:25:47ハスクルにはメイン関数があるんですが、
- 00:25:49これはあの、メインイコールプリントXで
- 00:25:51、えっと、xを印刷するということが言え
- 00:25:54ます。はい。え、これ、えっと、Xという
- 00:25:59のを今、あの、決め打ちしましたが、今度
- 00:26:02キーボードから撮ってくることにし
- 00:26:04ましょう。つまりXの値が何になるかって
- 00:26:07いうのは3等価じゃないです。Xは3等価
- 00:26:10ではないので、どうするかって言うと、
- 00:26:12これ入出力のものはIOをつけます。
- 00:26:15さっきね、え、maybeをつけましたが
- 00:26:18、今度はIOストリングにします。えっと
- 00:26:21、これは、え、外部から取ってくる可能性
- 00:26:23があるというもの。え、読み出すまで値が
- 00:26:28分からないもの。これをね、えっと、
- 00:26:30アクションという風に呼びますが、ま、
- 00:26:31IOストリングでいいです。
- 00:26:34教科書には確かアクションって書いてあり
- 00:26:36ますが、IOオストリングでいいです。で
- 00:26:37、それは何かって言うと、ゲットラインと
- 00:26:40いう関数で、この、この関数の方はIO
- 00:26:43ストリングで、え、実行された時に
- 00:26:46キーボードから読む、つまりあの、
- 00:26:48アクションなんですね。あの、行動なん
- 00:26:51ですね。え、ファンクションではなくて
- 00:26:53アクションであると、行動であると。で、
- 00:26:55そうすると
- 00:26:57Xを読みますよと。で、これを合成したい
- 00:27:00。あの、印刷したい。その時にこの
- 00:27:03バインド演算士ま使って構わないという
- 00:27:06ことですね。バインドエンザー子というの
- 00:27:08は、あ、ファンクタ、ま、正確に言って
- 00:27:10モナードとモナードをつぐものだからXと
- 00:27:14いうのは、え、何か値読んでくるんだ
- 00:27:17けれども、ま、読んできた値の中身を
- 00:27:20取り出してプリントに入れてで、またこう
- 00:27:23などにパックしてくれるということ。こ、
- 00:27:25つまりバインド演山子がそのまま使えると
- 00:27:28いうことですね。で、え、これをじゃあ
- 00:27:32途中のおっと、お、もう終わるぞっていう
- 00:27:35風に言われちゃいました。えっと、
- 00:27:39もう1個別の関数、fという関数があった
- 00:27:41として、え、もしも文字の長さが3以上
- 00:27:45だったらロングで3以下だったらxのまま
- 00:27:49解る関数を作ったとしましょう。作ったと
- 00:27:52して、え、fxでできるかていうと、これ
- 00:27:56はエラーになります。なぜなら、あ、xは
- 00:27:58ゲットラインでIOストリングだから、あ
- 00:28:01、つまり型が違うわけですね。Xにはあの
- 00:28:07参照等下の変数を来ることを前提にして
- 00:28:11いるのにゲットラインというま、汚れた
- 00:28:13変数が来てしまう。だからこれはエラーに
- 00:28:16なってしまう。でどうしたらいいだろうか
- 00:28:18。え、つまりえっとストリングを、え、
- 00:28:21ストリングにするんじゃなくてストリング
- 00:28:23をIOストリングにしてあげる必要があ、
- 00:28:27ある。え、ものなどでくるんであげる必要
- 00:28:29がある。で、え、そうすると、え、どう
- 00:28:33するかっていうと、さっきの値
- 00:28:34コンストラクターを使う必要があるので、
- 00:28:37え、値コンストラクター、この場合は
- 00:28:39リターンという風なキーワード使います。
- 00:28:42あの、C言語とか、え、Java言語とか
- 00:28:44のリターンと違って、これは値
- 00:28:46コンストラクターです。制御分ではない
- 00:28:48です。値コンストラクターの
- 00:28:51リターンジャストと同じ意味ですね。え、
- 00:28:53リターン、え、を使ってリターンXえ、
- 00:28:57どちらかが実行される。で、え、そうする
- 00:29:00と今度は関数適用ができXがやっぱりダメ
- 00:29:06でしょ。が、えっと、IOストリングじゃ
- 00:29:09ないので、
- 00:29:11えっと、このXの値はXの片
- 00:29:14IOストリングだけど、このFはIO
- 00:29:16ストリング受け取らないので、IO
- 00:29:18ストリング受け取っちゃったらこのレクス
- 00:29:19関数使えないから、これは困るので、どう
- 00:29:22するかって言うと、お、ま、1つの解放は
- 00:29:27IOストリングを使って、IOストリング
- 00:29:29受け取ることにして、ここで、え、X、
- 00:29:32ここで、モナ、え、なんだ、バインド
- 00:29:34演算子を使っで、え、後ろに回してあげる
- 00:29:39ということですね。え、ちょ、これは
- 00:29:42ラム式使ってるけど、もうちょっと簡単な
- 00:29:44書き方もあるとは思います。ああ、これ別
- 00:29:46で別開ですね。はい。え、そうすることで
- 00:29:49FXFにかける。ま、あるいは別の方法と
- 00:29:52してはこれストリングのまま、えっと、
- 00:29:56おあまり、あ、こっちですね。こっちの別
- 00:29:59を使うという方法もあり。あん
- 00:30:05、あんまり良くないな。あの、良くないな
- 00:30:07。これちょっと自習やりましょう。あの、
- 00:30:10もうちょっと簡単な書き方もあるんですが
- 00:30:12、あ、えっと、基本このバインド演山子を
- 00:30:17使って、えっと、
- 00:30:21この
- 00:30:23パックされた変数を次々渡していくという
- 00:30:26ね、え、書き方があります。あと5分
- 00:30:29ぐらいある。ちょっと頑張って。えー、
- 00:30:32じゃあ、あ、
- 00:30:35ちょっとこれでちょっと頑張って。もう
- 00:30:39時間切れちゃったらごめんなさいです。
- 00:30:41はい。えっと、
- 00:30:43シェアの
- 00:30:46はい。パイザでちょっとやってみます。あ
- 00:30:48、これちょっと古いやつが書いてる。これ
- 00:30:50ちょっとさっき実験してたやつが書いてる
- 00:30:51んで。えっと、こうですね。
- 00:30:56してあ、ホストリングの
- 00:31:00方ですね。で、このままだとえっと
- 00:31:07で、えっと、入力に入力ハローワールド
- 00:31:10ですね。これ実行するとハローワールドっ
- 00:31:13て、え、出ますよと。で、え、もう1個
- 00:31:16関数、普通の関数を、え、
- 00:31:22があったとして、え、ですか、えっと、の
- 00:31:27、え、3文字以上だったら
- 00:31:33ロングで、え、
- 00:31:36それ以下だったらそのまんまとで、え、
- 00:31:39これを、えっと、fx×わけにはいかない
- 00:31:42ので、えっと、どうしようかな。ゲ
- 00:31:48のゲットラインの
- 00:31:52えっとこのバインドエ算者直接繋いでいく
- 00:31:55方法があります。え、リターンの
- 00:32:00えっと
- 00:32:02なんだ?
- 00:32:04F
- 00:32:06あ、違うわ。これさ、やっぱりラム式使わ
- 00:32:08ないといけないすね。
- 00:32:14しましょう。
- 00:32:16一旦この
- 00:32:22こうですね。これでいいかな?ごめん。
- 00:32:24うまくいったらエラー出ない。あ、行った
- 00:32:27、行った。はい。ツーロングで出ましたね
- 00:32:29。はい。で、これがもし短ければ、え、3
- 00:32:33文字にすればね、え、
- 00:32:38ヘイもだめかにしましょう。
- 00:32:44はい。はい。ま、こんな風に短く書くこと
- 00:32:47もできます。ということで、えっと、
- 00:32:51ごめんなさい。ちょっとエッセンスだけ
- 00:32:52しかお伝えできなかったけれども、次回に
- 00:32:56続きます。ちょっとこのプログラムも反映
- 00:32:58させた資料も後ほどアップをしておきます
- 00:33:01。ごめんなさい。ちょっとこの後、えっと
- 00:33:02、ニューティックと文教キャンパスの行っ
- 00:33:05たり来たりがあるので、え、
- 00:33:08ちょっと今日送れるかもしれませんが、
- 00:33:10今夜中にはアップしておこうと思います。
- 00:33:13え、お疲れ様でした。
- プログラミング
- 関数型プログラミング
- メイビー
- モナド
- エラー処理
- 関数合成
- オンライン講義
- 出席登録
- 大学
- プログラミング言語論