関数脳の考え方の重要性(なごやかScala勉強会に参加してみた)

この記事は書かれてから1年以上が経過しており、最新の情報とは異なる可能性があります

そもそもScalaとは何か?

まだまだ素人レベルなので、あんまり下手なことを言うとここちがうよーと言われてしまうのでちゃんとしたことは言えないのですが、 Javaというプログラミング言語が動くメリット(JVM上で動く)と、シンプルに書けるシンタックスとを併せ持った言語です。

  • Javaが動く環境で動く → Java動くとこならScala動くよ!
  • RubyとかPythonとかのように、処理をシンプルにさくっと書けるよ
  • 関数型言語だよ

あなたWeb制作会社で勤めてるのに、ぶっちゃけ使うの?

いいえ、使ってません。 が、今後どうなるか分かりませんよね。

なごやかにScalaを勉強する会

最近、名古屋でこんな初心者向けのイベントが開かれてます。現時点で4回行われてます。

なごやかScala #4

見てもらえれば分かりますが、毎月数章(1〜3章)を順に読んできつつ、なごやScalaな人たちが分かりやすく解説してくれます。

最初の数回は、プログラミング言語のいわゆる制御構文とか、よくあるようなくだりを順に解説してたりしたのですが、 そろそろ制御構文とかありきたりなところも読み終えて、関数型言語の面白そうなあたりの章に突入してきたので、 だんだんと面白くなってきてます。

元々関数型プログラミング言語に興味があったのですが、書籍を読むだけだと概念的なところの理解が追いつかず、 ただ書籍を読んで知った気になってドヤ顔するより、初心に返って胸を借りて勉強した方が100倍ためになるなーと思って 参加してみました。

タイトルの通り、ホントになごやかです。ぜんぜんこわくないです。


なごやかScala #4 の個人的なメモ

軽くメモ残してたのでついでに貼付けておきます。

出てないとなんのこっちゃだし、本題は下なので読み飛ばしてもらって結構です。

ちなみにここに資料あります。 コップ本8章解説

関数(メソッド?)について

  • ヘルパー関数など、処理を別の関数に分けるときに、全部グローバルに書くの良くない
  • そういうときに、ローカルのみのスコープとなるようなローカル関数を使う
  • そうすると、外側の関数の引数として受け取っていた変数は、スコープ内に存在しているので、ローカル関数に引数を渡す必要がなくなる、便利!

first class function

  • 第一級関数
  • リテラルがある、値として扱える、後から呼び出せる

関数リテラルの短縮形、プレースホルダー構文

  • 明らかなときはプレースホルダー(_)を使って簡単に書ける
  • 明らかなとき == (たぶん)型推論できるとき

部分適用された関数

  • 例えば引数a, b, cがあったとき、「bが○○だと分かっているとき」、みたいなことができる
  • 文字通り関数に対する部分的に適用で、返ってくるのも関数
  • こっちの関数のこの部分の処理と、あっちの関数のこの部分の処理が共通なんだけど、、、みたいなものをまとめやすいのかも?(処理の抽象化?)

クロージャ

  • 関数を値として使うには、自由変数を含んだ状態ではそのまま使えない
  • 自由変数(&束縛変数)とは、対象のスコープ内で値が決まってくるかどうか(だと思う)、自由変数はスコープ外の環境に依存する
  • 関数を値として使うとき、その環境を取り込んで関数値となるものをクロージャという

末尾再帰

  • ループじゃなく再帰の書き方でも、再帰処理の末尾に呼び出ししてるときは処理が最適化される
  • 相互末尾最適化はない(再帰処理を相互に呼び合うようなタイプ)

おまけ

  • 函数の函は箱って意味
  • Scalaやるなら、まずsbt入れよう、エディタは何でもいいよ

Webの過渡期なので、考え方を学ぶ重要性

最近(といってもけっこう前ですが)、こんなことを思うようになりました。

  • どんどん自動化される、楽な手段増える
  • 特に今は移り変わりが激しい、やらなきゃいけないことがころころ変わる
  • ツールの使い方を覚えるよりも、いつどんなツールが出てきてもすぐに使いこなせるような、考え方を養うべき?
  • 素のJavaScriptはおろか、生成してくれるタイプの別言語であっても、さらに良くて速いものが出るのは時間の問題?
  • 今のうちに関数型言語の考え方に多く触れることはとても重要では?

たぶんこれから便利なツールとかがどんどん出てきて、自動化されるところはとことんされていくと思うのです。 そんなときにどこに一番コストがかかるかというと、やっぱり考えるところではないかと思います。

特にWeb業界がどんどん他の業界につながっていくことを考えると、 逆にもっと他の業界のメソッドや考え方を取り入れていく必要性があるなーと思っています。

Rubyを初めてやったときに触れた「モノ+操作」感は、 オブジェクト指向を理解するのに非常にとっかかりになったのですが、 それを軽く超えるようなものすごい抽象化ができそうだなーと感じ始めてます。

名古屋って関数型言語を学ぶには素敵な環境ですねー。 せっかく初心者向けにやってくれているので、 みんな試しに出てみたらいいんじゃないでしょうか?


追記:#5が募集してるので載せておきます。

なごやかScala #5

この記事は書かれてから1年以上が経過しており、最新の情報とは異なる可能性があります

もし記事内に誤りなどございましたら、 @girigiribauer までご一報いただけると助かります。