「Scala関数型デザイン&プログラミング」のexerciseを解き進めるための環境準備をだいぶ書き換えて、読み進める上での準備作業を全部網羅してみたので、改めて「Scala関数型デザイン&プログラミング」を最初から読み進めるためのガイドっぽいことを書いてみます。
今回は第1章と、第2章までです。
Scala関数型デザイン&プログラミング ―Scalazコントリビューターによる関数型徹底ガイド (impress top gear)
- 作者: Paul Chiusano,Rúnar Bjarnason,株式会社クイープ
- 出版社/メーカー: インプレス
- 発売日: 2015/03/20
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (7件) を見る
第1章 関数型プログラミングとは
第1章はおもに「副作用の排除」について書かれています。
冒頭のコードが実際に実行できない(外部のAPIに依存している、という設定)なのと、コード事例自体があまり副作用の排除によるメリットが見えづらい(テスタビリティが上がったことを実感しづらい)コードになっているので、理解しづらいところがあります。
本当は、「コーヒーの代金を課金する」という本質的な機能はそのままで、その後の色々な機能拡張(まとめて払うとか)のときに重複が上手く排除できたことを示せると良いのでしょう。しかし、そこまでやると紙面も使いすぎてしまうので、かなり急ぎ足の解説になっています。なので、まずはざっと読んで、先に進める方が良さそうです。
実際に、外部のAPIや、再現性の低い機能(時刻とか、乱数だとか)などを対象にテストで苦労したり、随時に行った機能追加でまったく重複したコードを書いた経験が無いと、メリットが理解しづらいかもしれません。
第2章 Scala関数型プログラミングの準備
以降、本を読んだだけでは分からなさそうな箇所をポイントを絞って解説していきます。
2.1 速習:Scala言語
Scalaという言語の解説が始まります。わりとコンパクトに、分かりやすくまとまっていますが、object
キーワードで作られるシングルトンの解説がポイントです。
Javaではデザインパターンの一つとして使われているシングルトンがScalaでは言語仕様として用意されています。機能としては書かれていますが、あまり存在理由というか、そのメリットについては書かれていないので、デザインパターンなどの解説を(実装方法は別として)読んだ方が理解し易いでしょう。
2.2 プログラムの実行
scalac
とscala
コマンドを使ってコードを実行する方法が説明されています。sbt
からの実行方法については、下記の記事を参考にしてみてください。
「Scala関数型デザイン&プログラミング」のexerciseを解き進めるための環境準備
2.4 高階関数:関数に関数を渡す
高階関数という用語が難解なイメージを抱かせますが、Java8ではラムダ式、LL系言語やJavaでも無名関数と、実際には割とよく使われている概念です。
自分がいままで使ってきた言語でどう実現されているか、振り返ってみると分かりやすいでしょう。
再帰も同様に、まずは自分が使ったことのある言語で試してみると良いでしょう。
exercise 2.1
アルゴリズム系では定番の、フィボナッチ数列を求める関数の作成です。
関数のひな形は、以下のファイルに書かれています。
exercises/src/main/scala/fpinscala/gettingstarted/GettingStarted.scala
初期状態では下記の通りのコードになっています。
object MyModule { ... def fib(n: Int): Int = ??? ... }
見慣れない???
は正しいScalaの構文で、コードが未定義であることを示すメソッドです。実行するとNotImplementedError
の例外が送出され、実行時エラーになります。
まずはこの???
を削除して、解答となるコードを書いていきます。回答はanswer
の同名のファイルに書かれています。
ここでもフィボナッチ数列と、Scalaにおける再帰を一度に理解しようとすると混乱してしまうので、まずは既に理解している言語で再帰を使って記述してみることをお勧めします。
コードを書いたら、以下の手順で実行します。サンプルコードではMyModule
というobject内に定義するようになっているので、fpinscala.gettingstarted
パッケージをインポートして、MyModule.fib
という形式で関数を呼び出します。
$ ./sbt > project exercises > console scala> import fpinscala.gettingstarted._ scala> MyModule.fib(10) res1: Int = 55 scala> MyModule.fib(0) res2: Int = 0
2.6 型に従う実装
カリー化や、関数合成と言った重要なキーワードが出てきますが、この段階ではexerciseをどんどん解いていって、先に進める方が良さそうです。
ただし、これらのキーワードはのちのち重要になってきますが、凄くさらっと説明されているので、先に進む上ではこの本以外のソースから定義や使い方を調べておいた方が良いでしょう。
おわりに
あくまで自分が初めて読んだときにつまづいた所を中心に書いていったので、当然別のバックグランドの人は別のところでつまづくと思います。
次回は第3章からスタートです。
Scala関数型デザイン&プログラミング―Scalazコントリビューターによる関数型徹底ガイド
- 作者: Paul Chiusano,Rúnar Bjarnason,株式会社クイープ
- 出版社/メーカー: インプレス
- 発売日: 2015/04/30
- メディア: Kindle版
- この商品を含むブログ (2件) を見る
Scalaではありませんが、Haskellベースの関数型プログラミングの入門本が増補改訂されたので、ぜひ読んでみたいところです。
[増補改訂]関数プログラミング実践入門 ──簡潔で、正しいコードを書くために (WEB+DB PRESS plus)
- 作者: 大川徳之
- 出版社/メーカー: 技術評論社
- 発売日: 2016/09/24
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る