関数型プログラムってなんなのさ・・・
こんにちは、KUJIRAです。最近Scalaを勉強していますが、どうしても従来型のプログラムコードしか組めていないような気がします。というか関数型とはなんなのでしょうか?せっかくScalaをやっているので関数型のプログラミングを勉強しないといけないのは分かっているのですが、どうにも分からないことばかりです。ということで今日は関数型プログラムについて少し調べたことを書こうと思います。
Scalaの本を読んでいるのですが、その本によると関数型の特徴というのは以下のようになっているらしいです。
- 「var」変数を極力減らし「val」で対応する
- 関数には副作用を持たないように極力配慮する
ということで以下のことを順々に勉強します。
- 関数の副作用について
- 関数型について
関数の副作用について
関数型プログラミングを学ぶに当たりよく出てくるワードが「副作用」という言葉です。この言葉はなんなのだろう?ということでWikiで調べてみたら次のように書いてありました。
副作用とは、ある機能がコンピュータの状態を変化させ、それ以降で得られる結果に影響を与えること。
ということらしいです。要するに変数に値を入れたり標準出力に値を出力したりということが副作用になるらしいです。例えば次のような関数は副作用をもたらします。
1 2 3 4 5 6 7 8 9 10 |
def testPrint(args: Array[String]): Unit = { var i = 0 while(i < args.length) { println(args(i)) i += 1 } } val testArray = Array("test1", "test2") testPrint(testArray) |
こうやってみると何でもかんでも副作用を及ぼすので関数型のプログラミングなんていうのは無理そうに思うのですが・・・一体どうしたらいいのでしょうね ^^;
関数型について
先ほども言ったことなのですが、今読んでいる本によると関数型プログラムのコーディングというのは以下のようなことに気をつけてやるのがいいそうです。
- ミュータブル(var)な変数を使用せず、イミュータブル(val)な変数を極力使う。
- 関数は極力副作用を持たないようにする。
これらを気をつけることによりプログラムを簡潔に書けるようにできる上、試験を減らすことができるそうです。varやミュータブルオブジェクト、副作用のあるメソッドを使うときは明確なニーズや正当化できる理由がある時に限るらしいです。
なので先ほどのプログラムソースは以下のようにするのが正しいです。
1 2 |
def testPrint(args: Array[String]) = args.mkString("\n") println(testPrint(Array("test1", "test2"))) |
これが関数型プログラムの第一歩となるそうです。まだなんなのかはよく分かりませんが本を読んで勉強しコードを書いていこうと思います。書いているうちに色々と感覚的に分かってくるのでしょう。ということで今日はここまで、KUJIRAでした。