金曜日のネコ

8割日記、2割技術

関数型初心者がScalaを勉強した(その2)

前回

nasustim.hatenadiary.com

TL;DR

手続き型しかやってこなかった人間が関数型言語の作法を知るまで。

関数型言語とは

これに関しては様々な議論があるし僕も確かなことは分からないのだが、一番根っこにある思想は「副作用の無い関数の組み合わせでプログラミングを行う言語」だと思う。

What is 副作用

  • その関数の外の世界に影響を及ぼさないこと

オブジェクティブなJavaScript

ファンクショナルなScala

オブジェクト指向の書き方を使ったJavaScriptはMeクラスのコンストラクタ内で定義されたメンバ変数[ age ]の値をaging()関数で操作しているので「副作用がある」。

一方Scalaの方は、操作する対象となる変数を引数とし、操作された結果を戻り値として返す「副作用のない」関数を定義し、その関数に値を噛ませることでプログラミングを行っていく。

JavaScriptでお馴染みの[ Array().map() ]や[ Array().forEach() ]も入力として処理を加える値や処理を持ち、処理結果が戻り値として出力される(map()だけ)ので関数型言語のお作法に近い。

とはいえScalaはマルチパラダイム(関数型+オブジェクト指向)の言語であるし、手続きを記述して逐次的に処理をさせていると言われればそれもそうなので、純粋な関数型言語を学びたくなったらHaskellとかOCamlを勉強しようと思う。

関数型言語でプログラミングをするとどういう嬉しいことがあるの

ソフトウェアがどんどん複雑になるにつれ、それを上手く構造化することがますます重要になっている。上手く構造化したソフトウェアは書きやすく、デバッ グしやすく、かつ、将来のプログラミングコストを引き下げるために再利用可能な部品群を提供するものである。従来の言語では問題を部分化する方法について概念的な限界がいくつかある。関数型言語はこれらの限界を押し広げるものである。

なぜ関数プログラミングは重要か

その他

関数型言語にはカリー化とかモナドとか重要キーワードがあるけれど、深入りすると沼にハマりそうなので余裕のある時に。