2025プログラミング言語論 IOモナド

00:33:18
https://www.youtube.com/watch?v=CUBQVKvOQZg

概要

TLDRこのオンライン講義では、プログラミング言語論における関数型プログラミングの概念、特にメイビー(Maybe)モナドについて詳しく説明されています。講義は40分の制限があり、出席登録のURLも提供されています。メイビーは、値が存在しない可能性を表現するためのモナドであり、エラー処理や関数合成の方法についても触れられています。

収穫

  • 🖥️ プログラミング言語論のオンライン講義
  • ⏳ 最大40分の制限
  • 📋 出席登録のURL提供
  • 🔍 メイビー(Maybe)モナドの説明
  • ⚙️ 関数合成の重要性
  • 🚫 エラー処理の方法
  • 📚 関数型プログラミングの概念
  • 💡 参照性と不変性の重要性
  • 🗓️ 次回の授業は来週
  • 📖 教科書の参照ページ

タイムライン

  • 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型の変数を扱う際の注意点が述べられる。具体的なプログラム例が示され、次回の授業についての案内が行われる。

もっと見る

マインドマップ

ビデオQ&A

  • この講義のテーマは何ですか?

    プログラミング言語論に関するオンライン講義です。

  • メイビーとは何ですか?

    メイビーは、値が存在しない可能性を表現するためのモナドです。

  • この講義はどのくらいの時間ですか?

    講義は最大40分間です。

  • 出席登録はどのように行いますか?

    出席登録のURLがチャット欄に提供されています。

  • 次回のオンライン授業はいつですか?

    次回のオンライン授業は来週の同じ時刻に行われます。

ビデオをもっと見る

AIを活用したYouTubeの無料動画要約に即アクセス!
字幕
ja
オートスクロール:
  • 00:00:00
    をしておきます。録画始まったかな?はい
  • 00:00:03
    。え、改めて、えっと、プログラミング
  • 00:00:06
    言語論の、え、オンライン講議になります
  • 00:00:11
    。で、えっと、大学のライセンスの関係で
  • 00:00:15
    、えっと、ね、最大ね、40分しか、あ、
  • 00:00:20
    Zoom
  • 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:25
    1回画面全部じゃない。これ
  • 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:21
    96ページはあんまり参考にならない。
  • 00:02:24
    63ページカウントダウン問題のところに
  • 00:02:29
    えっと載ってるこれ113ページのところ
  • 00:02:34
    本当かメイ
  • 00:02:40
    13ページのところに出てるのかな。ま、
  • 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:12
    2のプログラムというのは要するにこう
  • 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:40
    PYONとかだとね、順番に書いていくと
  • 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:59
    Pythonでもし実行するとこんな風に
  • 00:06:01
    0ディビジョンエラーというエラーが発生
  • 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:38
    Javとか、あ、PYONもそうですね、
  • 00:06:41
    C++もそうですね。え、例外がキャッチ
  • 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:44
    Mayイ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:04
    justという値コンストラクターを使え
  • 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:11
    beフロートになっている。メイは
  • 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:05
    Funターズアプリカブズ
  • 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:14
    3を足すと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:31
    IOストリングでいいです。
  • 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:57
    Xを読みますよと。で、これを合成したい
  • 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:14
    IOストリングだけど、このFはIO
  • 00:29:16
    ストリング受け取らないので、IO
  • 00:29:18
    ストリング受け取っちゃったらこのレクス
  • 00:29:19
    関数使えないから、これは困るので、どう
  • 00:29:22
    するかって言うと、お、ま、1つの解放は
  • 00:29:27
    IOストリングを使って、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:49
    FXFにかける。ま、あるいは別の方法と
  • 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:04
    F
  • 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
    え、お疲れ様でした。
タグ
  • プログラミング
  • 関数型プログラミング
  • メイビー
  • モナド
  • エラー処理
  • 関数合成
  • オンライン講義
  • 出席登録
  • 大学
  • プログラミング言語論