なっとく!関数型プログラミング
https://scrapbox.io/files/65ad066c5eb637002326f4c6.png
結局関数型プログラミングって何なんですか?
プログラムの基本単位として関数、特に純粋関数を利用するプログラミングのパラダイムのことである
純粋関数はシグネチャが嘘をつかない、副作用がない
そのためにデータがイミュータブルであることが推奨されている
関数は値として扱うことができる、関数を返す関数は高階関数と呼ばれたりする
オブジェクト指向のプログラミングは命令的であるが、関数型では宣言的と呼ばれる。どうやって行うか(How)ではなく何を行うか(What)を記述することに焦点を合わせる
IOなどの外部へのリクエスト副作用をどのように扱うのでしょうか?
遅延評価の仕組みを利用して、先に関数を定義して、実行時に副作用を扱うようにすることで、純粋ではない関数部分を最小限に抑える
Scalaにおけるモナドとは何ですか?
モナドは、デザインパターンの一種で、副作用のある処理を包み、コンテナのように格納する構造であり、操作を連鎖的に適用する方法を提供する
外部から取得するデータを扱う場合
エラーをtry catchで扱うのではなく、Option型やEither型などで値が存在するかどうかを型でwrapして、連鎖的に操作する中でエラー発生時はNoneを返して連鎖をエラーなく終了させるようにする
取得が成功するまで再帰的にデータを取得することもできるし、終了条件を自由に設定することもできる
Stream型は何が便利なのか?
Stream型を使うと、無限を簡単に扱うことができる
遅延評価の仕組みを利用しているので、値の生成方法だけを定義して、実際に利用するまで実際に値は生成されない、という使い方ができる