第7章. ここからどこへ行くのか?
この作品はAIを使って翻訳されている。ご意見、ご感想をお待ちしている:translation-feedback@oreilly.com
不変性、参照透過性、高階関数、遅延性、パターンマッチングなど、FPのさまざまな側面を見てきたし、これらの構成をコードに採用するさまざまなメソッドも見てきた。次のレベルとは何か?どうやってそこに到達するのか?いくつかの方法がある。
ピュア・ルートを行く
本書では、これらのテクニックを使えば使うほど、コードが「より機能的になる」ことを強調してきた。しかし、コードを「完全に機能的」にすることはできるのだろうか?答えは「一種の」であり、その意味を正確に説明する。私たちはこのようなコードを "純粋機能コード "あるいは "純粋関数コード "と呼びかけている。まずは、print 。ほとんどの非自明なプログラミングでは、多くの副作用が発生する。例えば、ファイルへの書き込み、コンソールへの印刷、ソケットのオープン、例外のスローなどだ。もし我々のコードがこれらのどれかを持っているなら、それは純粋に関数的なものではない。
これに対して何ができるだろうか?もし副作用をコードから完全に排除することができなくても、少なくとも必要な副作用はすべて、いわばプログラムの外枠に隔離することができる。私は外枠という言葉を比喩的に使っている。つまり、副作用をすべて、他の部分と容易に区別できるプログラムの一部分に隔離するのである。これらをプログラムの純粋な部分と不純な部分と考えることができる。不純な部分とは、すべての副作用がある場所である。
次の行をコードに入れたいとしよう:
println("Starting up...")
これは副作用である。この副作用をプログラミングの外枠に隔離するとどうなるだろうか?そのために、run メソッドを持つ Scala traitSE (副作用用)を作成してみよう:
trait[A]SE(a:A){defrun}
この動作は、println ステートメントをこの特性でラップするというものだ。しかし、式は実際には何も表示しない:
SE(println("starting up"))
副作用の説明だと思えばいい。印刷が行われるのは、そのメソッド(run )を呼び出したときだけだ。Scalaには実際にはこのようなtraitはないが、ScalaのFP用Cats Effectライブラリにはこのようなクラスがある。これはたまたまモナドで、IO と呼ばれている。IO モナドを動機づける別の方法を見てみよう。 参照の透明性と関係がある。
次のプログラミングを考えてみよう:
valx=23(x,x)
以前のプログラミングは以下のものと同じか?
(23,23)
これを発見するには、x の各インスタンスに23 を代入すればよい。こうすると、両方のプログラミングは次のようになる:
(23,23)
この2つのプログラミングは実際には同じものだと結論づけることができる。
変数のインスタンスに値を代入するには、その関数が参照透過的でなければならない。これを理解するために、同じ例をprintln 。
valx=println("Dude!")(x,x)
先のコードは次のコードと同じプログラミングか?
(println("Dude!"),println("Dude"))
違う!この2つのプログラミングを実行すると、最初の方は"Dude!" を1回だけ出力し、2番目の方は "Dude ...