関数の中では以下のように評価されます。10回目まで追加したら終了こうすることで、toArray関数を呼び出した時にtake関数を評価して値を受け取れるようになります。take関数を評価するタイミングをずらしたー遅延評価したというわけです。これで、関数型の特性を壊すことなく、結果を受け取れるようになります。ちなみに、先ほど説明した「モナド」や「処理系丸投げ」も、遅延評価とタッグを組むことで大きな効果を発揮します。なると、関数を引数として渡せる言語仕様になっているかどうかがカギになります。そこで、観点を言語仕様に向けてみます。言語仕様的観点から・関数がファーストオブジェクト先ほど説明した遅延評価は非常に重要なのですが、それを実現するためには条件があります。それは、言語仕様で関数がファーストクラスオブジェクトと定義されていることです。ファーストクラスオブジェクトの詳説については、Wikipediaの記事をご参照いただければということで、本記事向けに4つにまとめてみました。ここでピンとくる方がいらっしゃると思いますが、関数の評価結果が「その関数を呼び出す関数」ならば、評価したい時に評価できる、つまり遅延評価が実現可能ということになります。関数を例に手を加えてみます。実装がわかりやすくなるように静的型付けも付けておきます。表示される関数を生成して、それを返すことによって関数を評価するタイミングをずらすことができるようになりました。モジュール別にすることで、セカイのコンテキストを切り分けることが可能になっています。すれば、画面に出力するモナドも、「画面に出力する値を返す関数を持っている集合」と捉えれば腑に落ちるのではと思っております。上記のコードでピンと来るかもしれませんが、言語仕様として静的型付けがあると、要求外の関数を扱うリスクを抑えられますのでプログラムを組む際は大変助かります。関数型のセカイのメリットここまで書いたところで、ようやくメリットを説明できるようになりました。先人たちは、これらのメリットを生かせたいといった想いが関数型のセカイを生み出したと言っても過言ではありません。いえ、詳細に説明するとさらにボリューミーになりますので、簡単に列挙するに留めます。後述の参考文献で紹介している「関数型プログラミングの基礎」では、メリットをページを割いて紹介しております。小回りが利くモジュールを作れる数学的な関数として考えていると、内容を細かい単位で分割して、少ないコードで定義するようになります。部品を組み立てるように複雑な処理を実装できるようになります。依存の少ないコードになるあらゆる要求をこなす(特にアジャイルで開発している場合)ためには、依存性の少ないコードが大事です。関数型のセカイでは、物事を抽象的に捉えるプログラムを組むことになるので、自然と依存性が少なくなります。処理のパフォーマンスを上げられる参照透明な関数を使うときは、非常に複雑で時間がかかる関数だとしても、引数が同じならば同じ結果ですし、副作用を考慮する必要はありません。「一旦結果がわかれば、同じ引数の時は評価を端折れる」と考えるのは道理です。引数と結果でハッシュを作っておけば、大幅な処理時間の削減に寄与できます。テストがしやすくなる参照透明な関数は、テストをするときに結果が予測しやすくなります。ユニットテストを実装するときにアサーションを作りやすくなくなります。関数化するということはモックやスタブにしやすくなりますので、副作用を思い通りの内容に変えることもできます。関数型のセカイのデメリット一番大きなデメリットはプログラムの構成が膨大になることです。パフォーマンスに関わる部分では慎重なトレードオフの判断が必要です。長い文章になっていることからもわかる通り、業務として対応する場合は、ある程度の学習コストが必要になります。おわりにここまで、関数型プログラミングについてつらつらと書いてまいりましたが、膨大な文章量になってしまったことをお詫び申し上げます。いえども、どのような方が読者になられるのかを絞り切れなかったため、仮として「命令型プログラミングを嗜んでいる方」「いろいろな言語やフレームワークを触っていたら、気が付いたら関数型ライクになっていた方」を対象読者としていましたが、それでも、リアルデータ認識からの脱却から始めないと掴みきれないのは事実です。*9そして、コンピューターでプログラムを組むことにとって、最大の摂理は「コンピューターは与えられた命令を、即座に、従順かつ順番に実行していく存在しでしかない」ということです。これこそ、何物にも妨げられない事実なのです。プログラムを組むのは人間です(AIは置いといて)。人間が求めるプログラム像を思い通りの形で実現したいという想いが集まって色々なセカイができ、「宣言型のセカイ」が生まれ、「関数型のセカイ」が生まれました。一瞬、難解そうなそれぞれのセカイですが、背景や捉え方を学ぶことでより納得し、実作業に落とし込み易くなるかと存じます。本記事がその研鑽の一助になればと祈念して筆を置きたいと思います。ご精読お疲れさまでした。型というものを用意しています。存在してはいけないものです。いうのも、関数ですから、必ず評価結果を返さなければならないためです。そのため、関数型のセカイでは、必ず何かしらの結果を返す必要があります(引数そのものを返してしまうのが通例です)。返すようになっています(参照透明を守れるのでアリです)。関数型のセカイは、これまでの説明通り、厳密な数学的実装を守るといった話ではないので、実装する言語が関数型に特化する必要はありません。純粋関数型言語を導入しようとすると、学習・導入コストが余計跳ね上がります。