純粋関数型言語と参照透過性
純粋関数型言語と参照透過性:
ワイ・・・ワイ。
ハスケル子・・・インターンの中学生。こちらの記事を参照。
ワイ「なぁ、ハスケル子ちゃん」
ワイ「ちょっと教えてほしいことがあるんやけど」
ハスケル子「なんですか」
ワイ「ハスケル子ちゃんの好きなHaskellっていうのは」
ワイ「純粋関数型言語ってやつやんな?」
ハスケル子「そうですね」
ワイ「なんというか、よう分からへんねんけど」
ワイ「純粋関数型言語を使うと何が嬉しいんか、ワイに教えてくれへん?」
ハスケル子「嬉しいというか」
ハスケル子「参照透過性が担保されてるのはいいと思います」
ワイ「その参照透過性って言葉、たまに見かけるけどどういう意味なん?」
ハスケル子「参照について透過的な性質です」
ワイ「うん、せやな」
ワイ「それが分からへんいう話なんやけど」
ハスケル子「じゃあまず、参照っていう言葉は」
ワイ「せやな」
ワイ「参照は何となく分かるわ」
ハスケル子「じゃあ次は透過的って言葉ですけど」
ハスケル子「透過しちゃうわけなので」
ハスケル子「まるで目に見えない」
ハスケル子「つまり存在を意識しないって感じです」
ワイ「ふむふむ」
ハスケル子「だから」
ハスケル子「参照なんていう概念が無いかのように扱える」
ハスケル子「ってことです」
ワイ「なるほどな・・・」
ワイ「ほんで、それは」
ワイ「どういう意味かいな?」
ハスケル子「・・・チッ」
ワイ「(舌打ち!?)」
ハスケル子「ええと、コードで説明したほうが早いですね」
ハスケル子「例えば」
ハスケル子「っていうように」
ハスケル子「
ハスケル子「それを100行後に」
ハスケル子「みたいに使うってなったら」
ハスケル子「どんなことを意識しますか?」
ワイ「ええと」
ワイ「その間の処理を追っかけんとな」
ハスケル子「そうですよね」
ハスケル子「でも純粋関数型言語では」
ハスケル子「再代入という概念がないので」
ハスケル子「一度定義した値は不変です」
ワイ「ほええ」
ハスケル子「つまり」
ハスケル子「一度定義したら、常に
ワイ「なるほどな」
ワイ「再代入が可能な言語の場合は」
ワイ「そうやないっちゅうことやな」
ハスケル子「はい」
ハスケル子「
ハスケル子「単に
ハスケル子「なので」
ハスケル子「参照なんていう概念が無いかのように扱える」
ハスケル子「つまり参照透過的だということです」
ワイ「ほええ」
ハスケル子「変数が参照透過的だと、色々と心配事が減るんです」
ワイ「なんとなく分かるで」
ハスケル子「そうです」
ハスケル子「さらに」
ハスケル子「純粋関数型言語では関数の戻り値も参照透過的なので」
ハスケル子「同じ引数を渡せば常に同じ値を返してくれるんです」
ワイ「なるほどな」
ワイ「場面によって戻り値が変わったりせぇへん、いうことか」
ワイ「それは扱いやすいかもな」
ワイ「でも・・・」
ワイ「逆に場面によって処理を変えたい場合はどうすんの?」
ワイ「例えば・・・」
ワイ「みたいに、」
ワイ「場面によって挨拶を出し分けたいときとか」
ハスケル子「その場合は」
ハスケル子「こんな感じにしますかね」
ワイ「おお」
ワイ「つまり」
ハスケル子「そんな感じです」
ハスケル子「もしこの関数をテストするときとかも」
ハスケル子「朝と夜に2回テストしないでも」
ハスケル子「
ハスケル子「テストがしやすいです」
ワイ「引数として
ハスケル子「私なら型を自作して
ハスケル子「素のJSでは出来ませんけど」
ワイ「なるほどな(型を自作?)」
ワイ「でもその・・・」
ワイ「今は朝やから
ワイ「結局はどこかに現在の場面や状態みたいなもんを保存しとかなあかんのとちゃうん・・・?」
ワイ「それともワイ、勉強しすぎて頭がおかしくなってしまったん・・・?」
ハスケル子「この先は、実際にやめ太郎さん自身がコードを書いてみたほうが分かりやすいと思います」
ハスケル子「Haskellと似た文法でコードを書いてHTMLやJavaScriptに変換できる、」
ハスケル子「Elmっていう純粋関数型言語があるので」
ハスケル子「それを勉強してみたら色々と実感を持って理解できると思いますよ」
ワイ「Elmちゃんか」
ワイ「聞いたことあるわ」
ワイ「さっそく明日にでもやってみるわ」
ワイ「おおきにやで」
〜続く〜
登場人物
ワイ・・・ワイ。ハスケル子・・・インターンの中学生。こちらの記事を参照。
素直になったワイ
ワイ「なぁ、ハスケル子ちゃん」ワイ「ちょっと教えてほしいことがあるんやけど」
ハスケル子「なんですか」
ワイ「ハスケル子ちゃんの好きなHaskellっていうのは」
ワイ「純粋関数型言語ってやつやんな?」
ハスケル子「そうですね」
ワイ「なんというか、よう分からへんねんけど」
ワイ「純粋関数型言語を使うと何が嬉しいんか、ワイに教えてくれへん?」
ハスケル子「嬉しいというか」
ハスケル子「参照透過性が担保されてるのはいいと思います」
それ is 何
ワイ「その参照透過性って言葉、たまに見かけるけどどういう意味なん?」ハスケル子「参照について透過的な性質です」
ワイ「うん、せやな」
ワイ「それが分からへんいう話なんやけど」
ハスケル子「じゃあまず、参照っていう言葉は」
変数ハスケル子「みたいに使うじゃないですか」x
は3
という値を参照している
ワイ「せやな」
ワイ「参照は何となく分かるわ」
ハスケル子「じゃあ次は透過的って言葉ですけど」
ハスケル子「透過しちゃうわけなので」
ハスケル子「まるで目に見えない」
ハスケル子「つまり存在を意識しないって感じです」
ワイ「ふむふむ」
ハスケル子「だから」
ハスケル子「参照なんていう概念が無いかのように扱える」
ハスケル子「ってことです」
ワイ「なるほどな・・・」
ワイ「ほんで、それは」
ワイ「どういう意味かいな?」
ハスケル子「・・・チッ」
ワイ「(舌打ち!?)」
ハスケル子「ええと、コードで説明したほうが早いですね」
ハスケル子「例えば」
keruko.js
let x = 3;
ハスケル子「
x
という変数に3
を代入したとして」ハスケル子「それを100行後に」
keruko.js
func(x);
ハスケル子「どんなことを意識しますか?」
ワイ「ええと」
ワイ「さっきはワイ「って思うな」x
は3
やったけど」
ワイ「100行ほど色々あったから」
ワイ「x
は今どんな値を参照してんのかいな?」
ワイ「その間の処理を追っかけんとな」
ハスケル子「そうですよね」
ハスケル子「でも純粋関数型言語では」
ハスケル子「再代入という概念がないので」
ハスケル子「一度定義した値は不変です」
ワイ「ほええ」
ハスケル子「つまり」
ハスケル子「一度定義したら、常に
x === 3
です」ワイ「なるほどな」
ワイ「再代入が可能な言語の場合は」
ワイ「この変数ワイ「ってなるけど」x
は、コンピュータ上の何処かに保存されとる3
という値を今は参照しとる・・・」
ワイ「しかし次に使うときに何を参照しとるかは分からへん・・・」
ワイ「そうやないっちゅうことやな」
ハスケル子「はい」
ハスケル子「
x
はどこかにある値を参照している、と考えなくても」ハスケル子「単に
3
がそこにあるかのように扱えるんです」ハスケル子「なので」
ハスケル子「参照なんていう概念が無いかのように扱える」
ハスケル子「つまり参照透過的だということです」
ワイ「ほええ」
ハスケル子「変数が参照透過的だと、色々と心配事が減るんです」
ワイ「なんとなく分かるで」
ワイ「何かの関数の副作用で」ワイ「っちゅうことがないってことやな?」
ワイ「知らんうちにx
の値が変わっとった!」
ハスケル子「そうです」
ハスケル子「さらに」
ハスケル子「純粋関数型言語では関数の戻り値も参照透過的なので」
ハスケル子「同じ引数を渡せば常に同じ値を返してくれるんです」
ワイ「なるほどな」
ワイ「場面によって戻り値が変わったりせぇへん、いうことか」
ワイ「それは扱いやすいかもな」
ワイ「でも・・・」
ワイ「逆に場面によって処理を変えたい場合はどうすんの?」
ワイ「例えば・・・」
keruko.js
let scene = "朝"; function aisatsu () { switch (scene) { case "朝": return "おはよう"; case "夜": return "こんばんは"; } } alert(aisatsu());
ワイ「場面によって挨拶を出し分けたいときとか」
ハスケル子「その場合は」
keruko.js
function aisatsu (scene) { switch (scene) { case "朝": return "おはよう"; case "夜": return "こんばんは"; } } alert(aisatsu("朝"));
ワイ「おお」
ワイ「つまり」
ワイ「さあ、あいさつをせえ!」ワイ「て感じやなくて、」
ワイ「(今は朝やから、おはようで頼むで?)」
ワイ「朝のあいさつをせえ!」ワイ「って明示的に指示する感じやな」
ハスケル子「そんな感じです」
ハスケル子「もしこの関数をテストするときとかも」
ハスケル子「朝と夜に2回テストしないでも」
ハスケル子「
朝
と夜
という2つの引数を与えてテストしてみればいいだけなので」ハスケル子「テストがしやすいです」
ワイ「引数として
昼
を与えたらどうなんの?」ハスケル子「私なら型を自作して
朝
と夜
以外はブロックします」ハスケル子「素のJSでは出来ませんけど」
ワイ「なるほどな(型を自作?)」
ワイ「でもその・・・」
ワイ「今は朝やから
朝
っていう引数を与える、っていうのはどうやって判断すんの・・・?」ワイ「結局はどこかに現在の場面や状態みたいなもんを保存しとかなあかんのとちゃうん・・・?」
ワイ「それともワイ、勉強しすぎて頭がおかしくなってしまったん・・・?」
ハスケル子「この先は、実際にやめ太郎さん自身がコードを書いてみたほうが分かりやすいと思います」
ハスケル子「Haskellと似た文法でコードを書いてHTMLやJavaScriptに変換できる、」
ハスケル子「Elmっていう純粋関数型言語があるので」
ハスケル子「それを勉強してみたら色々と実感を持って理解できると思いますよ」
ワイ「Elmちゃんか」
ワイ「聞いたことあるわ」
ワイ「さっそく明日にでもやってみるわ」
ワイ「おおきにやで」
〜続く〜
コメント
コメントを投稿