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

00:27:01
https://www.youtube.com/watch?v=8gqLFZwJXF4

الملخص

TLDRこの動画では、プログラミング言語論におけるメイビーモナドについて解説しています。関数型プログラミングの基本概念を振り返り、特にエラー処理やユーザー入力に関する問題を扱います。メイビーモナドは、値が存在しない可能性を考慮した型システムを提供し、エラーを安全に扱う方法を示します。具体的には、Haskellを用いて、0での割り算のエラーをナッシングとして扱う方法を説明し、リストモナドとの比較も行います。

الوجبات الجاهزة

  • 👨‍💻 メイビーモナドはエラー処理を安全に行う手法
  • 🔍 関数型プログラミングの基本は関数の合成
  • ⚠️ 例外処理は不変性と相性が悪い
  • 📊 メイビーフロートは実数またはナッシングを返す
  • 🔗 Haskellでの関数合成は演算子を使用
  • 🛠️ リストモナドとメイビーモナドの違い
  • 💡 エラーを型システムで管理する利点
  • 📈 ユーザー入力の扱いに注意が必要
  • 🔄 関数合成演算子を使って関数を組み合わせる
  • ❓ ナッシングは値が存在しないことを示す

الجدول الزمني

  • 00:00:00 - 00:05:00

    このオンライン講義では、プログラミング言語論におけるメイビーモナドについて説明されている。関数型プログラミングの基本概念として、関数が入力を受け取り、出力を返すことが強調され、元の値が変わらないことが重要であると述べられている。

  • 00:05:00 - 00:10:00

    関数型プログラミングの特性として、ユーザーからの入力を受け付ける際の課題が挙げられ、ループや条件分岐の処理方法についても言及されている。特に、入出力を扱うための枠組みとしてメイビーモナドが導入される。

  • 00:10:00 - 00:15:00

    エラー処理の重要性が強調され、特にゼロ除算のようなエラーが発生する場合の対処法について説明されている。多くのプログラミング言語では例外を投げるが、関数型プログラミングでは状態を変更することが好ましくないため、別のアプローチが必要である。

  • 00:15:00 - 00:20:00

    メイビーモナドの具体的な実装方法が説明され、特にナッシングという概念が導入される。これにより、計算結果が存在しない場合に適切に処理できるようになる。

  • 00:20:00 - 00:27:01

    関数合成の重要性が再度強調され、メイビーフロートを扱う関数の合成方法について具体的なコード例が示される。最終的に、メイビーモナドを用いることで、エラー処理をより柔軟に行うことができることが説明され、講義が締めくくられる。

اعرض المزيد

الخريطة الذهنية

فيديو أسئلة وأجوبة

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

    メイビーモナドは、値が存在しない可能性を考慮した型システムで、エラー処理を安全に行うための手法です。

  • 関数型プログラミングの基本概念は何ですか?

    関数型プログラミングでは、関数が入力を受け取り、出力を返すという考え方が基本です。

  • Haskellでのエラー処理はどうなりますか?

    Haskellでは、エラーをナッシングとして扱うことで、エラーが発生する可能性を型システムで管理します。

  • リストモナドとメイビーモナドの違いは何ですか?

    リストモナドは複数の値を扱うのに対し、メイビーモナドは値が存在しない可能性を考慮した単一の値を扱います。

  • 関数合成とは何ですか?

    関数合成は、複数の関数を組み合わせて新しい関数を作る手法です。

  • エラー処理における例外の問題は何ですか?

    例外は状態を変更するため、関数型プログラミングの不変性と相性が悪いです。

  • メイビーモナドの利点は何ですか?

    メイビーモナドは、エラー処理を型システムで管理し、プログラムの安全性を高めます。

  • Haskellでの関数の合成はどう行いますか?

    Haskellでは、関数合成演算子を使用して、関数を組み合わせることができます。

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

    メイビーフロートは、実数またはナッシングのいずれかを返す型です。

  • ナッシングとは何ですか?

    ナッシングは、値が存在しないことを示す特別な値です。

عرض المزيد من ملخصات الفيديو

احصل على وصول فوري إلى ملخصات فيديو YouTube المجانية المدعومة بالذكاء الاصطناعي!
الترجمات
ja
التمرير التلقائي:
  • 00:00:02
    え、皆さんこんにちは。あ、
  • 00:00:04
    プログラミング言語論のオンライン講義
  • 00:00:07
    です。え、画面共有をね、え、していき
  • 00:00:10
    ます。えっと、こっちですね。え、
  • 00:00:13
    メイビーモナトの話ですね。はい。え、
  • 00:00:17
    今回の動画ではメイビもなどについて、え
  • 00:00:23
    、お話をしていきます。途中にあの
  • 00:00:26
    ハスケルのコードが出てきますので、ま、
  • 00:00:30
    オンラインコンパイラーとか使って、え、
  • 00:00:33
    実際にね、あの、動かして、え、みて
  • 00:00:36
    ください。その方がね、え、理解が深まる
  • 00:00:39
    と思います。はい。まず、あの、これまで
  • 00:00:43
    、あの、我々ね、関数型プログラミングと
  • 00:00:46
    いう考え方を勉強してきました。えっと、
  • 00:00:51
    ま、ここにね、x=fxって書いてあり
  • 00:00:54
    ますが、ま、これは基本系ですね。入力と
  • 00:00:57
    なるxがあって、え、出力となるxがある
  • 00:01:01
    よと。で、え、そこを繋ぐものが、ま、x
  • 00:01:05
    に何か加工して、え、ま、xそのものを
  • 00:01:08
    書き換えないんだけれども、xに、ま、何
  • 00:01:11
    らかの手を加えて、え、xプライムを返す
  • 00:01:15
    ものが関数でした。ここであの大事なのが
  • 00:01:20
    関数型プログラミングの、ま、考え方の
  • 00:01:22
    大事なのが大事なことが、あ、元のxその
  • 00:01:27
    ものはいつ見ても同じ値であるということ
  • 00:01:31
    でしたね。え、xというのは、え、いつ見
  • 00:01:35
    ても同じ値、え、変化がしないということ
  • 00:01:40
    でした。でえ、これはあの、ま、ほとんど
  • 00:01:45
    の場合において、え、役に立つわけなん
  • 00:01:49
    ですが、これ3照性と呼びますが、
  • 00:01:52
    ほとんどの場合において役に立つことなん
  • 00:01:53
    ですが、あ、
  • 00:01:56
    あの、
  • 00:01:58
    ユーザーからの入力を受け付けるような
  • 00:02:00
    場合、え、ですね、これが、あ、ま、唯一
  • 00:02:05
    、ま、唯一なのかな、あ、困る点ではあり
  • 00:02:08
    ます。他にぱっと見困るところとしては、
  • 00:02:11
    ま、もちろんね、え、ループであったりと
  • 00:02:14
    か、ま、条件分岐とかどうするのっていう
  • 00:02:18
    、う、疑問は持たれるところなんですが、
  • 00:02:23
    え、ループに関して言うと、ま、これまで
  • 00:02:26
    ね、やってきた通り、えー、マップとか
  • 00:02:31
    フォールドというね、え、関数を使えば、
  • 00:02:35
    ま、中身はあの再起関数なんですが、あ、
  • 00:02:39
    このループカウンターというものを使わ
  • 00:02:42
    なくても同等の表現力があるということ、
  • 00:02:47
    え、が分かっていると思います。ま、一方
  • 00:02:49
    のね、入室力に関しては、あ、ま、そう
  • 00:02:53
    いった方法が使えないので、え、別の枠組
  • 00:02:57
    が必要になってきます。で、今日は、ま、
  • 00:03:00
    この動画の中では入室力までは使いません
  • 00:03:03
    が、それに非常にこう近い、ま、元となる
  • 00:03:07
    考え方であるものなどというね、考え方を
  • 00:03:11
    導入していきます。と言っても、あの、え
  • 00:03:15
  • 00:03:17
    IOモナドというね、入室力を扱うモナド
  • 00:03:20
    までは立ち入らずに今日はメイビーモナド
  • 00:03:23
    という考え方を導入します。で、モナド
  • 00:03:28
    自体はこれまでも知らず知らずのうちに
  • 00:03:31
    使っていて、それがリストモナドというね
  • 00:03:34
    、え、構造です。これはリストを扱う、あ
  • 00:03:38
    、ま、リストそのものであってリストが実
  • 00:03:41
    はモナドの一種であったということなん
  • 00:03:43
    ですね。その話も今日この動画の中でして
  • 00:03:47
    いこうかなと思っています。で、え、前回
  • 00:03:50
    までの講義の中で繰り返しお話ししてきた
  • 00:03:54
    ことが、ま、この関数
  • 00:03:57
    ですね、ファンクションファンクって書い
  • 00:03:59
    てあるところなんですけれども、これは
  • 00:04:00
    実際にはこう複数の関数を合成して作る
  • 00:04:03
    ことがあ、できるんだよというようなこと
  • 00:04:07
    でした。ファンク1、ファンク2、
  • 00:04:08
    ファンク3で書いて失礼、え、書いてあり
  • 00:04:11
    ますが、ま、数式では、あ、FGHですね
  • 00:04:15
    。で、この中グロが関数合成円山子、
  • 00:04:19
    ファンクションコンポジションですね、
  • 00:04:22
    あの、関数合成円算子を表しています。え
  • 00:04:26
    、このf(g)hというのは、ま、
  • 00:04:29
    いわゆるこう通常の関数、値を受け取って
  • 00:04:32
    値を返すという関数でした。で、え、
  • 00:04:36
    こんな話も出てきました。ま、Xがフロー
  • 00:04:40
    、ま、不動少数点、え、ま、数学で実質で
  • 00:04:45
    あった時に、えっと、あ、これごめん
  • 00:04:48
    なさい。これ取るの忘れてました。この、
  • 00:04:51
    これなしね。はい。え、関数で、え、何か
  • 00:04:57
    、あ、計算を行って値を返す。で、ところ
  • 00:05:01
    が、あ、この
  • 00:05:04
    計算にエラーという情報を持たせたい場合
  • 00:05:07
    ですね。え、極端な例を言うと0算ですね
  • 00:05:12
    。1÷0っていくらですか?というとこれ
  • 00:05:14
    はもう実数の範囲では表現できない、え、
  • 00:05:17
    わけです。え、数ではない。で、えっと、
  • 00:05:21
    これも例えばPYONで1÷0というもの
  • 00:05:25
    を、ま、これAの値に0入れてるんです
  • 00:05:27
    けれども、1÷Aとやると、え、これは
  • 00:05:30
    ディビジョン0というエラーを起こします
  • 00:05:32
    。ただしこのジずらから、えっと、
  • 00:05:35
    プリント1÷Aというところだけを見ても
  • 00:05:38
    、えっと、Aが0かどうか分からないので
  • 00:05:41
    、え、この事前には分からないわけですね
  • 00:05:44
    。このプログラムコードを見ても、
  • 00:05:46
    あるいは数式を見ても、ここがエラーなの
  • 00:05:49
    か正しい計算なのかは分からないので、
  • 00:05:52
    これは実行するまで分からないと。で、
  • 00:05:55
    こんな時に、あの、どうしますかと、え、
  • 00:05:59
    計算打ち切るんですか?あるいはユーザー
  • 00:06:01
    にどうやってこうエラーを知らせるんです
  • 00:06:03
    か?という問題が、あ、生じてきます。ま
  • 00:06:06
    、PYON含む多くの言語はこの場合例外
  • 00:06:08
    を投げる。Javですね、
  • 00:06:10
    Javascririptもそうですね、
  • 00:06:11
    あの、例外を投げるという、ま、ビルト
  • 00:06:15
    インの気候があるわけな。言語にはない
  • 00:06:18
    ですけれどもね、あの、え、例外を投げる
  • 00:06:21
    という気候があるんですが、あ、その例外
  • 00:06:24
    を投げるというのは、あ、ま、例外という
  • 00:06:28
    変数を書き換えること、ま、状態ですね、
  • 00:06:30
    状態変数を書き換えるということになるの
  • 00:06:32
    で、これはあの関数型プログラミング、
  • 00:06:37
    3照性を担保したプログラミングとは、あ
  • 00:06:40
    、相性のいいものではない。ま、何か
  • 00:06:42
    うまいメカニズムを考えたいということに
  • 00:06:44
    もなります。え、プログラムを異常終了さ
  • 00:06:47
    せるというな例が発生させることになるん
  • 00:06:49
    ですが、これあまりいい方法ではあ、ない
  • 00:06:52
    ということですね。あ、もちろん好ましい
  • 00:06:56
    場合もあります。例外発生させたい場合も
  • 00:06:57
    ありますが、ま、関数型プログラミングを
  • 00:07:01
    実践している、う、関数型プログラミング
  • 00:07:04
    を使いたいという状況化では例外というの
  • 00:07:07
    はあまり嬉しいものではないと、え、いう
  • 00:07:11
    ことになります。では、あ、この有利数
  • 00:07:14
    全体あるいは、ま、実数全体、ま、今の
  • 00:07:17
    場合だと有利数で十分ですが、あ、割算
  • 00:07:19
    ですから、ああ、ごめんなさい。えっと、
  • 00:07:21
    整数の場合はですね、有理数全体でいい
  • 00:07:23
    です。
  • 00:07:24
    今の例えだと実数全体よりも広い集合を
  • 00:07:29
    使って、え、このゼロザ山エラーという
  • 00:07:32
    ものを含むような
  • 00:07:35
    値を返すな、ま、例えばインフィニティと
  • 00:07:38
    、ま、無限代という値にするという手も
  • 00:07:42
    ありますし、インフィニティは実数に含ま
  • 00:07:44
    れませんから、あ、ま、少なくとも不動
  • 00:07:48
    少数点には含まれないので、えっとね、あ
  • 00:07:52
    、正確に言うとインフィニティを意味する
  • 00:07:54
    気構はあるんだけれども、ま、一般的には
  • 00:07:56
    これ実数に入らないので、え、この実数
  • 00:07:59
    よりも広い集合を使う、あるいはノットア
  • 00:08:01
    ナンバーというね、もう数じゃありません
  • 00:08:03
    という、え、フラグを立てる、え、という
  • 00:08:07
    方法もあります。で、ハスケルが採用し
  • 00:08:09
    てるのはより汎用的な枠組を使うと、これ
  • 00:08:12
    はゼロ除山とかの数値計算だけではない他
  • 00:08:18
    のエラーも扱えるような枠組を使うことに
  • 00:08:22
    しています。こういった風に、え、想定さ
  • 00:08:25
    れている、え、
  • 00:08:29
    ま、関数というのは、あ、えっと、
  • 00:08:33
    え、何、定域と地域がありますよね。で、
  • 00:08:36
    その想定されている地域よりも広い集合を
  • 00:08:42
    使うという考え方、ま、それが、あ、あの
  • 00:08:46
    、今日ご紹介するものなどという考え方に
  • 00:08:49
    なります。はい。1÷0どうするか。ま、
  • 00:08:53
    例えば関数fxが1÷xであったとし
  • 00:08:58
    ましょう。当然xが0の場合には、あ、
  • 00:09:01
    つまりf0はこれは実数の範囲で、え、解
  • 00:09:06
    を、あ、解というかな、値を持たないで
  • 00:09:09
    どうするかということですね。えっと、
  • 00:09:12
    ハスケルでプログラムを書くとここですね
  • 00:09:15
    、フロートからフロートへという関数で
  • 00:09:17
    f(x)=1÷x。これ1.0÷の方があ
  • 00:09:22
    、いいですね。1.0÷xにしとき
  • 00:09:24
    ましょう。1.0÷xという風にすると、
  • 00:09:29
    ま、これはxが0.0の時にはエラーを
  • 00:09:32
    起こします。そこでどうするかと言うと、
  • 00:09:35
    こんな風な定義を考えます。もしxが0で
  • 00:09:38
    あればす
  • 00:09:40
    が0だったらアダワイズですね。この上の
  • 00:09:44
    条件式が成り立たなかった場合どうする
  • 00:09:46
    かっていうとこれ新しい記号ですね。これ
  • 00:09:49
    あのナッシングという風に呼びます。あの
  • 00:09:52
    空習号とかも意味ももあのありますがあの
  • 00:09:55
    これナッシングと呼びます。えっとこの値
  • 00:09:58
    がえっとナッシングですよと。FXの値が
  • 00:10:02
    ナッシングですよという風にします。そう
  • 00:10:05
    するとFXというのはXは、え、実数なん
  • 00:10:08
    だけれどもFX全体はの地域は、え、実数
  • 00:10:14
    またはナッシングのどちらかということに
  • 00:10:16
    なるんですが、えっと、ま、数学者はこれ
  • 00:10:19
    でいいんですけれども、プログラミング的
  • 00:10:21
    には、え、型が違う、え、こっちが実数型
  • 00:10:25
    で、え、こっちがナッシングというなんか
  • 00:10:28
    違う集合だというと、ちょっと気持ちが
  • 00:10:30
    悪いので、この両方を含む大きな方を考え
  • 00:10:35
    ます。で、え、それを、ま、メイ実数と
  • 00:10:39
    いう風に呼ぶことにしましょう。あるいは
  • 00:10:41
    メイビ不動数点と呼ぶことにしましょう。
  • 00:10:44
    えっと、プログラムの上ではメイフロート
  • 00:10:46
    という方になります。で、え、
  • 00:10:51
    はただの実数なので、え、フロートなので
  • 00:10:54
    、え、これはメイフロートにする
  • 00:10:57
    コンストラクター、ま、オブジェクト思行
  • 00:10:59
    でコンストラクターでくるんであげること
  • 00:11:02
    にしてこんな書き方をしてみます。え、
  • 00:11:05
    これは、えっと、ジャスト1/xという風
  • 00:11:07
    に読みます。ジャストっていうのが
  • 00:11:09
    コンストラクターのことです。え、
  • 00:11:11
    ジャスト1/xまたは、あ、メ、えっと、
  • 00:11:14
    ナッシング。FXのXっていうのは定義域
  • 00:11:18
    は実数なんだけれどもフロートなんだ
  • 00:11:20
    けれども、え、戻りは地域はえっとメイビ
  • 00:11:24
    フロートですよと。フロートからメイ
  • 00:11:27
    フロートに戻りますよと。で、xが0ので
  • 00:11:30
    はない時にはjustxが0の時は
  • 00:11:34
    ナッシングと考えるともうこれ型も一致
  • 00:11:38
    するのでもう先言っちゃいましたね。の
  • 00:11:40
    こうですね、あの
  • 00:11:43
    肩の不置が起こらない。ifで分岐した時
  • 00:11:46
    に肩のふチが起こらないということになり
  • 00:11:49
    ます。元々はFをフロートからフロートへ
  • 00:11:52
    という関数だと思っていたんだけれども、
  • 00:11:55
    そうじゃなくて今はフロートから
  • 00:11:57
    mayイビーbeフロートへの関数ですよ
  • 00:11:59
    と。で、え、中身どんなものかって言うと
  • 00:12:02
    Xがノ
  • 00:12:05
    、えっと、ま、これ関係演算子だから空白
  • 00:12:07
    入れときましょうかね。えっと、xが、
  • 00:12:09
    えっと、0でなければjust、それで
  • 00:12:14
    なければナッシングですよと、え、いう
  • 00:12:17
    関数を作ったとしましょう。そうすると、
  • 00:12:21
    ま、こんな風に、ま、数式の上ではこう
  • 00:12:23
    いう風に書けますよということですね。で
  • 00:12:26
    、これが
  • 00:12:28
    、え、メイビーbeという考え方の正体
  • 00:12:33
    です。で、これ実はあのメイビー使う必要
  • 00:12:36
    、あえて使う必要は特段えなかったんです
  • 00:12:40
    ね。実はリストでも同じことができます。
  • 00:12:44
    リストというのは、あ、こうですね。これ
  • 00:12:46
    リストを使った例ですが、あ、値計算結果
  • 00:12:51
    がある場合は
  • 00:12:53
    で、計算結果がない場合は空っぽのリスト
  • 00:12:56
    を返す。これ同じことができます。え、
  • 00:13:01
    全く同じことができます。素の方が
  • 00:13:02
    ちょっと柔軟なんで、え、これには、あ、
  • 00:13:05
    第2要素、第3要素って付け加えることも
  • 00:13:08
    できるんだけれども、ま、こういう使い方
  • 00:13:10
    ができるということはメイビーとリストっ
  • 00:13:13
    ていうのは構造的によく似ているという
  • 00:13:18
    ことで、実際にハスケルのプログラムを
  • 00:13:20
    書いてみてもこ、ま、リスト版ですね、え
  • 00:13:24
    、やっても同じことができるわけですね。
  • 00:13:27
    マッシングの代わりに空合、え、ジャスト
  • 00:13:30
    の代わりにこうリストコンストラクターを
  • 00:13:33
    使う。これは全然おかしくないいうわけ
  • 00:13:37
    ですが、ま、数学的な意味合いを考えると
  • 00:13:41
    これリストなんだっけ?それとも失敗する
  • 00:13:44
    可能性があるって意味なんだっけ?え、と
  • 00:13:47
    いう風に
  • 00:13:49
    紛らわしくなるので、ま、メイビーという
  • 00:13:51
    ものを使っておきましょうと。メイビー
  • 00:13:53
    モナド。え、リストもこれリストモナドと
  • 00:13:56
    呼びますが、リストモナドではなくメイビ
  • 00:13:59
    モナドを使っておきましょうということに
  • 00:14:01
    なります。
  • 00:14:04
    はい。もち美味しいです。
  • 00:14:08
    えー、ではこれちょっとね、準備中にね、
  • 00:14:12
    なんかちょっと印つけちゃったんですけど
  • 00:14:14
    印いらなかったです。はい。えっと、今の
  • 00:14:17
    話は、あ、
  • 00:14:20
    フロートを受け取ってメイビーフロートを
  • 00:14:23
    返す。つむ、ちょっと汚染されているかも
  • 00:14:26
    しれない。これはナッシングになるかも
  • 00:14:29
    しれないという意味で
  • 00:14:31
    色をつけてますが、あ、この汚染されたと
  • 00:14:34
    も言います。え、文脈を持つとも言います
  • 00:14:36
    。いろんな呼び方があります。え、この
  • 00:14:39
    メイビーを返す関数、ま、メイビーを返す
  • 00:14:43
    関数、モナドを返す関数ですね。はい。
  • 00:14:45
    えっと、フロートを取って、え、メインB
  • 00:14:47
    フロートを返す関数という考え方があ、
  • 00:14:50
    できます。では、この関数が、え、この
  • 00:14:55
    ここにさらに次に、次の関数が来るとし
  • 00:14:58
    ましょう。それをすると何考えないといけ
  • 00:15:00
    ないかって言うと、メイフロート受け取っ
  • 00:15:03
    てメイフロート返す関数っていうのが必要
  • 00:15:06
    になって、え、きます。で、これはそんな
  • 00:15:09
    難しくなくて、こうですね。えっと、もし
  • 00:15:13
    xがナッシングでなくてかつ0でなければ
  • 00:15:17
    justを返す。えー、そうでなければ
  • 00:15:21
    ナッシングを返すとおこれだけで、え、
  • 00:15:24
    結構です。これだけでいいです。ただあの
  • 00:15:28
    従来の
  • 00:15:31
    えっと関数と違ってここが入ってるという
  • 00:15:33
    ことですね。ナッシングでなければという
  • 00:15:35
    条件が入ってるということですね。さて、
  • 00:15:38
    えっと、関数型プログラミングの肝は関数
  • 00:15:42
    の合成にあるというね、話をしていました
  • 00:15:45
    。関数の合成はこの中グを使って表現する
  • 00:15:49
    のが、ま、一般的です。これ関数合成円算
  • 00:15:52
    士というもの
  • 00:15:54
    です。ではここでこの値ま、定義域地域が
  • 00:16:01
    それぞれ、え、メイビーであった場合に
  • 00:16:03
    どうすればいいんでしょうか。え、こんな
  • 00:16:06
    関数合成で、え、いいんででしょうか?で
  • 00:16:09
    、答えを言うとこの関数合成っていうのは
  • 00:16:12
    メイビ想定してないので、このまんまでは
  • 00:16:14
    書けません。え、どうするか今ちょっとお
  • 00:16:18
    さいしましょう。fx=えっと
  • 00:16:21
    justif
  • 00:16:23
    xnot=nシングかつ、え、x=0です
  • 00:16:29
    ね。それからそうでなければナッシングで
  • 00:16:31
    あるという時に今度はg(x)=2.0×
  • 00:16:35
    xという、ま、ま、ごくごく普通の関数を
  • 00:16:38
    作ったとしましょう。こいつはえっと
  • 00:16:40
    フロート受け取ってフロートを返してい
  • 00:16:42
    ます。だ、Fはフロートを受け取って、あ
  • 00:16:46
    、ごめんなさい。えっと、mayイを
  • 00:16:47
    受け取って、メイビフロート受け取って
  • 00:16:49
    メイフロート返してます。え、GXという
  • 00:16:52
    のはフロート受け取ってフローと返して
  • 00:16:54
    いる。ま、性格が異なる関数ですね。では
  • 00:16:59
    これどう合成するかfとgを合成したい
  • 00:17:03
    えっと
  • 00:17:05
    gドfという関数を作りたいとしましょう
  • 00:17:09
    。はい。にしてそれを2倍にするという
  • 00:17:13
    関数を合成したいとしましょう。はい。
  • 00:17:16
    まずこのgという関数を作ります。え、
  • 00:17:19
    gプという関数は何をするかって言うと、
  • 00:17:22
    gの戻り値を、え、ジャストでくるむだけ
  • 00:17:26
    。え、Justgxを返すという関数を
  • 00:17:29
    作ります。戻り値がジャストというのは
  • 00:17:32
    FXの戻り値がジャストなので戻りも
  • 00:17:35
    ジャストにしておきたいんです。一度、え
  • 00:17:37
    、メイフロートになったものをフロードに
  • 00:17:41
    戻すことは、あ、できないので、え、と
  • 00:17:44
    いうのはナッシングである可能性がある
  • 00:17:45
    からできないので、え、必ず最終的な値と
  • 00:17:49
    いうのは名備になってるはずだから、GX
  • 00:17:52
    のもジャス、えっと、ジャストでくるんで
  • 00:17:55
    あげます。で、え、次にこのGプライムと
  • 00:17:59
    Fを合成するこの関数演算子があればいい
  • 00:18:03
    わけですね。このちょっと白丸で表して
  • 00:18:05
    ます。この関数があればいいでFはあ、
  • 00:18:09
    えっとmayイbeフロート受け取るので
  • 00:18:11
    このメイビコンストラクターでくるんで
  • 00:18:13
    あげる必要があります。JustXを
  • 00:18:15
    受け取る必要があります。この形でいいん
  • 00:18:19
    だけれども、えっと
  • 00:18:22
    ハスケルのようなプログラミング言語では
  • 00:18:25
    これ順番を入れ替えてこう書くことが多い
  • 00:18:29
    です。どう書くかって言うとjustxに
  • 00:18:33
    まずfという関数を割り当てて、え、次に
  • 00:18:37
    gという関数を割り当てるというやり方が
  • 00:18:42
    行われます。
  • 00:18:49
    と、ここまで来て
  • 00:18:52
    はい、ちょっとレジュメを間違えていまし
  • 00:18:54
    た。ごめんなさい。ちょっと今修正します
  • 00:18:56
    。え、修正します。えっとですね、Fの
  • 00:18:59
    引数は
  • 00:19:01
    、あ、あってるわ。あって、あ、違う。
  • 00:19:05
    えっと、Fの引数はごめんなさい。ここ
  • 00:19:08
    ですね。えっと、ifの
  • 00:19:13
    はい、ここですね。えっと、Fはね、
  • 00:19:15
    メイビフロート受け取とるんじゃないです
  • 00:19:17
    。Fは、えっと、
  • 00:19:20
    アンドいらないな。Fは
  • 00:19:26
    こうですね。あの、Fは、えっと、
  • 00:19:30
    フロートを受け取ります。フロートを
  • 00:19:32
    受け取る関数です。これだからちょっと
  • 00:19:35
    巻き戻して間違い修正しないといけない
  • 00:19:38
    ですね。ここもですね。はい。え、
  • 00:19:41
    ちょっとごめんなさい。色々、えっと、
  • 00:19:44
    録画しつつで申し訳ないんだけども、お、
  • 00:19:53
    そうですね。はい。で、これ結構遡って
  • 00:19:57
    直す、修正しないといけない。直さないと
  • 00:19:59
    いけない。
  • 00:20:01
    あ、本当ですね。あ、あ、どん臭いこと
  • 00:20:04
    言ってしまったが。え、ご容赦、ご容者で
  • 00:20:09
    はい。えっと、Fはと大元にも、あ、それ
  • 00:20:13
    でさっきあれですね、あのアスタリスクを
  • 00:20:15
    つけてたんですね。
  • 00:20:20
    ああ、なんかね、あの、途中で勘違いして
  • 00:20:22
    たんですが、あ、こうです。
  • 00:20:28
    あの、コードの方はね、正しいので、えっ
  • 00:20:31
    と、これをお
  • 00:20:35
    ちょっと修正しときます。もうね、これ
  • 00:20:37
    気づいた時にね、修正しないとね、分かん
  • 00:20:40
    なくなっちゃうんで。はい。もう1回
  • 00:20:43
    ちょっとお話をすると、
  • 00:20:47
    えっと、xは、あ、フロートの値を取ると
  • 00:20:51
    、元の関数を思い出してください。えっと
  • 00:20:53
    、フロートを取ると。で、えっと、戻りは
  • 00:20:58
    、えっと、え、メイビフロートですよと。
  • 00:21:00
    で、GXは、えっと、フロートを取って
  • 00:21:04
    フロートを返す。だ、Fはメイを返すんだ
  • 00:21:07
    けれども、Gはフロートを返す。う、と
  • 00:21:10
    いうところで、じゃあフロートを返すG
  • 00:21:13
    プライムというのを作っておきま、あ、
  • 00:21:15
    メイビフロートを返すGプXというのを
  • 00:21:17
    作っておきましょうと。両方とも引数は
  • 00:21:20
    フロートですよと。で、え、それを合成
  • 00:21:23
    する関数があれば良くて、で、この合成
  • 00:21:27
    する関数は、あ、このメイ
  • 00:21:31
    、mayイビじゃない、ジャストxを
  • 00:21:33
    受け取るという風に、え、決めておくとf
  • 00:21:36
    の戻りが、あ、gプま、でもこれも
  • 00:21:41
    ちょっと書き方変えときましょうかね。
  • 00:21:44
    えっと、ね、これも、
  • 00:21:47
    これもxにしときましょう。これはね、実
  • 00:21:49
    はどっちでも、あの、どっちも正解っちゃ
  • 00:21:52
    正解なんですけどもはい。これはこの白丸
  • 00:21:56
    の定義与えてないからですね。どっちも
  • 00:21:58
    正解なんですけれども、ま、こういう関数
  • 00:22:00
    があった方が、あ、こういう関数合成が
  • 00:22:02
    あるといいよねと。で、え、こういう関数
  • 00:22:05
    合成の代わりに、え、ハスケルではこう
  • 00:22:09
    いう書き方をよく使います。のフロート1
  • 00:22:13
    回メイビーフロートにしておいてこの矢印
  • 00:22:17
    矢印エ算子これバインドエン算子と呼び
  • 00:22:19
    ますがバインドエン算子というのは
  • 00:22:22
    メイビーフロート受け取って中身の
  • 00:22:24
    フロートを取り出して関数に適用しますよ
  • 00:22:27
    。でこの関数はメイビーフロート返すので
  • 00:22:30
    メイフロートからまた中身を取り出してえ
  • 00:22:34
    フレームというフロートからメイビ
  • 00:22:36
    フロートへという関数に適用しますよと
  • 00:22:39
    いうことですね。なので、えっと、ここの
  • 00:22:43
    矢印とここの矢印を一緒にしておくために
  • 00:22:45
    、え、ここには、あ、ジャストがジャスト
  • 00:22:49
    Xにする必要があると、メイ
  • 00:22:50
    コンストラクターを入れる必要があると
  • 00:22:53
    いうことですね。これ先ほどはあの
  • 00:22:57
    、え、
  • 00:23:00
    こことここが意味が違って、これ関数合成
  • 00:23:04
    と関数適用で違うんだけれども、ま、それ
  • 00:23:06
    を一色端にするために同じ円算子で、え、
  • 00:23:10
    書くためにここをメイビーにしています。
  • 00:23:13
    メイビーフロートにしています。こうする
  • 00:23:15
    ことでこの1つの矢印でこう書いていく
  • 00:23:18
    こと、繋いでいくことができると。で、
  • 00:23:20
    これハスケルで書くとこうなりますよと。
  • 00:23:23
    Fは、あ、フロートをメイビフロートに
  • 00:23:26
    する関数ですよと。で、Gはフロート
  • 00:23:28
    フロートにする関数ですよという時にこの
  • 00:23:31
    Gプライムというのを使って、え、G
  • 00:23:34
    プライムから、あ、は、フロートからメイ
  • 00:23:37
    フロートにする関数であって、中身は
  • 00:23:41
    justgxですよと。で、え、そうする
  • 00:23:44
    と計算ってどうするかっていう、さっきの
  • 00:23:45
    矢印はこういう風な記号を使います。え、
  • 00:23:48
    ジャスト2を、え、バインドしてFに
  • 00:23:51
    バインドして、それをGプライムに
  • 00:23:52
    バインドするというような書き方。非常に
  • 00:23:55
    シンプルですね。ま、これで0助山という
  • 00:23:58
    ここがジャスト0だった場合にはずっと
  • 00:24:01
    ナッシングが続くということになります。
  • 00:24:06
    え、
  • 00:24:10
    はい。あの、もしね、これGのGが
  • 00:24:13
    ナッシングの場合っていうの書いてないん
  • 00:24:15
    だけれども、そこはこの円山子がうまく
  • 00:24:18
    対応してくれるという書き方になります。
  • 00:24:22
    はい。で、これ、あの、別があって、これ
  • 00:24:24
    別の書き方があって、えっと、さっきね、
  • 00:24:27
    こういう風に書いたんですが、あ、ま、
  • 00:24:29
    こういう書き方、この白丸定義しなかった
  • 00:24:33
    んですけれども、これどう書くかって、
  • 00:24:35
    あの、関数合成残算子で書きたい場合には
  • 00:24:39
    どうするかって言うと、えっと、あ、
  • 00:24:41
    ごめんなさい。えっと、こうですね。こう
  • 00:24:42
    いう関数があればいいわけですよ。何か
  • 00:24:45
    あればいいわけですよ。のG欲しっていう
  • 00:24:49
    のGスターっていうなんか関数があって、
  • 00:24:51
    そうすると、え、通常の関数合成でかけ
  • 00:24:53
    たらいいなと。で、え、このgから
  • 00:24:57
    gスターを作る関数がハスケルには用意さ
  • 00:24:59
    れています。え、それが何かって言うと、
  • 00:25:02
    リフトmという関数で、え、このリフトm
  • 00:25:05
    を使うとそのgに相する関数を作ることが
  • 00:25:09
    できて、で、それは、あ、あの通常の関数
  • 00:25:12
    合成演算子で合成することができるように
  • 00:25:16
    なります。え、こっちはね、ま、あの、表
  • 00:25:20
    だって使うことはあんまり内部では
  • 00:25:22
    めちゃくちゃ働いてるんだけれども、表
  • 00:25:24
    だって使うことはあんまりないかも。うん
  • 00:25:26
    。ま、僕は使うかな。使うけど、あの、
  • 00:25:29
    割とこう内部に隠されてる、え、気候に
  • 00:25:33
    なります。というわけで、えっと、もう1
  • 00:25:36
    回復習しておくと、えっと、ここですかね
  • 00:25:40
    。はい。ここで、えっと、値を受け取って
  • 00:25:44
    maybeを返す関数を考えた時に
  • 00:25:51
    と、あ、ごめんた。こっちだ。こっちです
  • 00:25:53
    ね。え、値を受け取って。え、
  • 00:25:59
    あ、これも違うな。ちょっと今日色々、
  • 00:26:02
    あの、1度喋ってみると色々間違いに
  • 00:26:05
    気づきいますね。はい。ここですね。の
  • 00:26:11
    関数を合成するところ
  • 00:26:14
    についてはこんな風にfxというxが
  • 00:26:18
    フロートで戻りがmaybの場合にはあ、
  • 00:26:23
    こういううフロートからフロートへという
  • 00:26:26
    関数とフロートからメイビーという関数を
  • 00:26:28
    合成するのにはあ、一旦こういう両方とも
  • 00:26:33
    フロートを受け取ってメイビーを返す、
  • 00:26:35
    メイビーフロートを返すような感想を作っ
  • 00:26:37
    ておいて、え、それをこんな風に合成する
  • 00:26:41
    ことで関数合成っていうのが実現できて
  • 00:26:44
    いるというお話でした。というわけで、
  • 00:26:48
    えっとこの歩行歩行じゃないかな、あの、
  • 00:26:51
    ま、メイビーの補足説明については終わり
  • 00:26:54
    たいと思います。お疲れ様でした。
الوسوم
  • メイビーモナド
  • 関数型プログラミング
  • エラー処理
  • Haskell
  • リストモナド
  • 関数合成
  • ナッシング
  • メイビーフロート
  • プログラミング言語論
  • ユーザー入力