ミルクボーイ漫才のプロトコルでわかる Haskell

![c8f643b0-0027-4d7f-93cf-c45b6ccc4392.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31613/439945fd-c6f3-3c08-2fd3-141b7a8a985d.png)[^ai]

**<font color="cornflowerblue">ボケ</font>&<font color="darkgreen"><font color="darkgreen">ツッコミ</font>**: どうもー、どうもどうもー

**<font color="darkgreen">ツッコミ</font>**: あー、ありがとうございますー、いま、**Cherry MX**[^cherry-mx] 互換のキーキャップをいただきましたけどもね

**<font color="cornflowerblue">ボケ</font>**: ありがとうございますー

**<font color="darkgreen">ツッコミ</font>**: こんなん、なんぼあってもいいですからね

**<font color="cornflowerblue">ボケ</font>**: 入れておきましょう

**<font color="darkgreen">ツッコミ</font>**: ゆーとりますけどね

**<font color="cornflowerblue">ボケ</font>**: いきなりですけどね、うちのオカンがね、**好きなプログラミング言語**があるらしいんやけど

**<font color="darkgreen">ツッコミ</font>**: あっ、そーなんや

**<font color="cornflowerblue">ボケ</font>**: その名前をちょっと忘れたらしくてね

**<font color="darkgreen">ツッコミ</font>**: 好きなプログラミング言語の名前を忘れてもうて、どうなんてんのそれ

**<font color="cornflowerblue">ボケ</font>**: でまぁ、色々聞くんやけどな、全然わからへんねんな

**<font color="darkgreen">ツッコミ</font>**: わからへんの？ いや、ほな俺がね、オカンの好きなプログラミング言語、ちょっと一緒に考えてあげるから、どんな特徴ゆうてたか教えてみてよ

**<font color="cornflowerblue">ボケ</font>**: **関数型言語でなんやらえらい純粋**やって言うねんな

**<font color="darkgreen">ツッコミ</font>**: おー、**Haskell やないかい**、その特徴はもう完全に Haskell やがな

**<font color="cornflowerblue">ボケ</font>**: Haskell なぁ

**<font color="darkgreen">ツッコミ</font>**: すぐわかったやん、**Haskell は副作用のない純粋関数を重視するプログラミング言語**やねん、**純粋な関数は参照透過性**と言われ、**入力が同じなら出力も必ず同じになる**んよ、Haskell よー、こんなもん

**<font color="cornflowerblue">ボケ</font>**: でもこれちょっとわからへんのやな

**<font color="darkgreen">ツッコミ</font>**: 何がわからへんのよー

**<font color="cornflowerblue">ボケ</font>**: いや俺も Haskell と思うてんけどな

**<font color="darkgreen">ツッコミ</font>**: いやそうやろ？

**<font color="cornflowerblue">ボケ</font>**: オカンが言うには、最も人気のあるプログラミング言語って言うねんな

**<font color="darkgreen">ツッコミ</font>**: あー、**ほな Haskell と違うかー**、Haskell は人気ないもんねー

**<font color="cornflowerblue">ボケ</font>**: そやねん

**<font color="darkgreen">ツッコミ</font>**: Haskell はね、2024 年 11 月の **TOBIE Index**[^tobie-index] で 34 位なんよ、関数型言語で言うたら 26 位の **Lisp にすら負けてんのよ**

**<font color="cornflowerblue">ボケ</font>**: そやねんな

**<font color="darkgreen">ツッコミ</font>**: な？ Haskell も **Python に勝てると思われたら荷が重いよ**あれ

**<font color="cornflowerblue">ボケ</font>**: そやねんそやねん

**<font color="darkgreen">ツッコミ</font>**: Haskell ってそういうもんやから、ほな Haskell ちゃうがなこれ

**<font color="cornflowerblue">ボケ</font>**: そやねん

**<font color="darkgreen">ツッコミ</font>**: ほなもう一度詳しく教えてくれる？

**<font color="cornflowerblue">ボケ</font>**: **数学できんと理解できんって思われてる**らしいねん

**<font color="darkgreen">ツッコミ</font>**: Haskell やないかい！ 文法がなにやら数式に似てたり、**やたらと数学の難しい概念**[^category-theory]を取り込んでるんやから

**<font color="cornflowerblue">ボケ</font>**: まあねー

**<font color="darkgreen">ツッコミ</font>**: でも別に数学できんでも Haskell はちゃんと理解できるで、現に俺は**数学全然わからんけど Haskell は理解できてる**からね、Haskell はそんなもんや

**<font color="cornflowerblue">ボケ</font>**: わからへんねん、でも

**<font color="darkgreen">ツッコミ</font>**: 何がわからへんの、これで

**<font color="cornflowerblue">ボケ</font>**: 俺も Haskell と思うてんけどな

**<font color="darkgreen">ツッコミ</font>**: そうやろ

**<font color="cornflowerblue">ボケ</font>**: オカンが言うには、スマホアプリもこれで作る、って言うねんな

**<font color="darkgreen">ツッコミ</font>**: ほな Haskell ちゃうやないかい！ **Haskell はスマホとか組込みとかは大の苦手**やねん、Haskell は速い CPU と大量のメモリがあって初めて活躍できるんやで

**<font color="cornflowerblue">ボケ</font>**: そやねんそやねん

**<font color="darkgreen">ツッコミ</font>**: な？ Haskell は**必要になるまで計算しない遅延評価**って仕組みが持ち上げられてるけど、そのせいで**サンクっていう未計算の領域**が増えてメモリリークならぬ**スペースリーク**[^space-leaks]が発生するから、メモリはあればあるだけええねんで

**<font color="cornflowerblue">ボケ</font>**: そやねんそやねん

**<font color="darkgreen">ツッコミ</font>**: そういうカラクリやから、あれ

**<font color="cornflowerblue">ボケ</font>**: そやねんな

**<font color="darkgreen">ツッコミ</font>**: Haskell ちゃうがな、ほなもうちょっとなんか言うてなかった？

**<font color="cornflowerblue">ボケ</font>**: 界隈ではモナドモナドうるさいねん

**<font color="darkgreen">ツッコミ</font>**: Haskell やないかい！ **Haskell はモナドって仕組みのせいでえらい難しいって誤解されてる**[^monad]ねん、Haskell よそんなもん

**<font color="cornflowerblue">ボケ</font>**: わからへんねん、だから

**<font color="darkgreen">ツッコミ</font>**: なんでわからへんの、これで

**<font color="cornflowerblue">ボケ</font>**: 俺も Haskell と思うてんけどな

**<font color="darkgreen">ツッコミ</font>**: そうやろ

**<font color="cornflowerblue">ボケ</font>**: オカンが言うには、プログラミング教室で最初に教わる言語って言うねん

**<font color="darkgreen">ツッコミ</font>**: ほな Haskell ちゃうやないかい！ **プログラミング教室では Haskell なんか教えへん**のよ

**<font color="cornflowerblue">ボケ</font>**: せやねん

**<font color="darkgreen">ツッコミ</font>**: Haskell はプログラミング教室で教えてもらえるようなカジュアルな言語ではないねん、だいたい教えられる人材が市場におらんし、そもそも需要がないねん

**<font color="cornflowerblue">ボケ</font>**: せやねん

**<font color="darkgreen">ツッコミ</font>**: Haskell 教えてもらえるのは大学院の数学科研究室か、**オブジェクト指向に飽きた CTO** とかがいる会社かなんかやねん

**<font color="cornflowerblue">ボケ</font>**: せやねんせやねん

**<font color="darkgreen">ツッコミ</font>**: いずれにせよ人材不足は否めんけどな

**<font color="cornflowerblue">ボケ</font>**: せやねんな

**<font color="darkgreen">ツッコミ</font>**: Haskell ちゃうがな、ほな、もうちょっとなんか言うてなかったか？

**<font color="cornflowerblue">ボケ</font>**: **型システムが厳しくてコンパイル通すのがめっちゃしんどい**らしいで

**<font color="darkgreen">ツッコミ</font>**: Haskell やないかい！ **初学者は Haskell のコンパイルエラーを解消するのに心折れて勉強をあきらめる**[^heartbroken]んやから、でも**コンパイルさえ通ったら型システムが実行時安全を保証してくれる**から実行時エラーがないねんで、まぁ**これは誇張**[^exaggeration]やねんけど

**<font color="cornflowerblue">ボケ</font>**: わからへんねん、でも

**<font color="darkgreen">ツッコミ</font>**: なんでわからへんの、これで

**<font color="cornflowerblue">ボケ</font>**: 俺も Haskell やと思うてんけどな

**<font color="darkgreen">ツッコミ</font>**: そうやで

**<font color="cornflowerblue">ボケ</font>**: オカンが言うには、ブラウザでも動くって言うねん

**<font color="darkgreen">ツッコミ</font>**: ほな Haskell ちゃうやないかい！ Haskell によく似た言語で **Elm や PureScript**[^elm-vs-purescript] っていうのがあって、これらはかなり文法的に Haskell に似てんねんけど Haskell やないからな。Haskell をブラウザで動かすには **GHCJS** ってのを使えばできなくもないねんけど、**誰も使ってないからノーカン**やな

**<font color="cornflowerblue">ボケ</font>**: そやねんな

**<font color="darkgreen">ツッコミ</font>**: Haskell ちゃうやないかい、ほな、もうちょっとなんか言うてなかったか？

**<font color="cornflowerblue">ボケ</font>**: インデントに気をつけあかんらしいねん

**<font color="darkgreen">ツッコミ</font>**: Haskell やないかい！ **インデントでコードブロックを表現する言語は Haskell と Python ぐらい**[^offside-rule]やねん、Haskell が 1990 年誕生、Python は 1991 年誕生やけど Haskell は 1985 年誕生の Miranda って言語に影響を受けていて、この Miranda がオフサイドルールの元祖やと俺は睨んどる

**<font color="cornflowerblue">ボケ</font>**: そやねんな

**<font color="darkgreen">ツッコミ</font>**: インデントに気をつけなあかん関数型言語、Haskell に決まりやん、そんなん

**<font color="cornflowerblue">ボケ</font>**: でもわからへんねん

**<font color="darkgreen">ツッコミ</font>**: わからへんことない、オカンの好きなプログラミング言語は Haskell やもぉ

**<font color="cornflowerblue">ボケ</font>**: でもオカンが言うには、Haskell ではないって言うねん

**<font color="darkgreen">ツッコミ</font>**: ほな Haskell ちゃうやないかい！ オカンが Haskell ではないと言うんやから Haskell ちゃうがな

**<font color="cornflowerblue">ボケ</font>**: そやねん

**<font color="darkgreen">ツッコミ</font>**: 先ゆえよ、俺がオフサイドルールの歴史説明してる時どう思っててん、お前

**<font color="cornflowerblue">ボケ</font>**: 申し訳ないよ、だから

**<font color="darkgreen">ツッコミ</font>**: ホンマにわからへんがなこれ、どうなってんねんもう

**<font color="cornflowerblue">ボケ</font>**: んでオトンが言うにはな

**<font color="darkgreen">ツッコミ</font>**: オトン？

**<font color="cornflowerblue">ボケ</font>**: **Rust**[^rust] ちゃうか？ って言うねん

**<font color="darkgreen">ツッコミ</font>**: いや絶対ちゃうやろ、もうええわー

**<font color="cornflowerblue">ボケ</font>&<font color="darkgreen">ツッコミ</font>**: ありがとうございましたー

[^ai]: AI に描かせた。時々描かせるが、期待通りに描かせるのがとても難しい。コツがあれば是非コメントください
[^cherry-mx]: Cherry MX とはドイツの CHERRY 社（<https://www.cherry.de/>）のキースイッチで、他社のメカニカルキーボードや自作キーボードに採用されており、圧倒的シェアを誇る。耐久性は 5000 万回、軸によっては 1 億回の耐性があり非常に信頼性が高い
[^tobie-index]: プログラミング言語のトレンドを毎月様々なメトリクスを用いて集計してくれているサイト。Java と C が２強だったが最近は Python の１強が続いている。<https://www.tiobe.com/tiobe-index/>
[^category-theory]: ラムダ計算、圏論（モナド）、抽象代数学（モノイド）、型理論、集合論、不動点など。これらは知らなくても大丈夫
[^space-leaks]: 2015 年に Haskell のスペースリークに関するアドベントカレンダーが立ち上がった。かなりマニアックだが読み物としても面白い。<https://qiita.com/advent-calendar/2015/haskell-space-leaks>
[^monad]: モナドは副作用を制御するための純粋関数型プログラミング言語への挑戦として Haskell に導入された。モナドが導入される前の Haskell はリストを用いて非決定性や副作用をモデル化していたが、I/O、状態管理、エラー伝播などの複雑な副作用を扱うには不十分だった。ここで [Philip Wadler](https://en.wikipedia.org/wiki/Philip_Wadler#:~:text=He%20has%20contributed%20to%20the%20theory%20behind%20functional%20programming%5B1%5D%20and%20the%20use%20of%20monads%3B%20and%20the%20designs%20of%20the%20purely%20functional%20language%20Haskell%5B2%5D) が圏論のモナドを Haskell の設計に適用できることを提案し、モナドは Haskell の副作用を制御する抽象的な枠組みとして取り込まれ、I/O、状態管理、エラー伝播などを統一的に扱えるようになった。ただし標準出力に Hello World を出力するだけでモナドが登場するので、初心者殺しとされている。初学者はモナドのことは全く気にしなくよい
[^heartbroken]: 要出典。ただし Haskell はコンパイルエラーを取るのに非常に苦労するのは本当
[^exaggeration]: 起こりにくいだけで、実際には実行時エラーは起こる。部分関数、ゼロ除算、リスト外アクセスなどが原因。それ以外にも不完全なパターンマッチは比較的簡単に、スタックオーバーフロー、スペースリークなどは気をつければ防げるが原因となり得る。I/O でエラーが起こるのは仕方がない
[^elm-vs-purescript]: [Elm](https://elm-lang.org/) と [PureScript](https://www.purescript.org/) は用途が少し違う。Elm は The Elm Architecuture（Model-Update-View パターン）で一貫性のある状態管理と描画を言語内にフレームワークとして備えている SPA フロントエンド特化用途、PureScript は AltJS としてフロントエンドやバックエンド、Node.js を用いた CLI などにも適用できる汎用用途として用いられる
[^offside-rule]: 正確には前述の Elm、PureScript などの Haskell インスパイア系言語、[Nim](https://nim-lang.org/)、[CoffeeScript](https://coffeescript.org/) などの Python インスパイア系言語もある
[^rust]: Rust は [Stackoverflow で 8 年連続で最も称賛されているプログラミング言語](https://survey.stackoverflow.co/2023/#:~:text=and%20markup%20languages-,Rust%20is%20the%20most%20admired%20language,-%2C%20more%20than%2080)ではあるが、筆者の周りでは筆者以外使っている人を見たことがない。筆者の用途は AWS Lambda を短時間・省メモリで動作させる、マイコンのファームウェアをそろそろ C じゃなく Rust で書く、ぐらい。PC アプリは [Electron](https://www.electronjs.org/)、[Tauri](https://tauri.app/)、[Flutter](https://flutter.dev/) で書いたことがあるが、圧倒的に Flutter が楽だった