Functional Programming in Scala の感想

http://www.manning.com/bjarnason
https://github.com/pchiusano/fpinscala

一年ちょっと前にblog書きましたが

Scalaz の作者の人達が書いた "Functional Programming in Scala" という本がでるらしい

14章のぞいてほぼ完成したので、感想書きます。MEAP v9の時点です。ちょっと長いですよ。


まず、全体を通していえるのが、Scalaの本ではなくあくまで関数型プログラミングの本だということです。それは本文の最初の方にも書いてあります。
この本だけ読んでも、Scala自体にはあまり詳しくなりません。Scala自体については、必要最低限の文法だけを随時説明してます。

逆に、(英語が読めるなら)Scalaの知識がほぼゼロだとしても、大体読めるのではないかと思います。


また、Scalazの本でもありません。これだけ読んでもScalaz自体には直接詳しくなれません。*1Scalazについては、数回名前が出てくる程度です。もちろんScalazにすでに存在するようなもの*2の説明になるわけですが、Scalazやその他の既にあるライブラリを使うのではなく、とにかく全部本文中で一から自作したもので説明していきます。

「本文中で一から自作」というスタンスは、型クラスのみならず、List、Stream、Futureなど、Scala標準ライブラリに存在するものまで、徹底的に一から自作しています。


なので「単にパターンを覚えて使う」のではなく、それぞれの関数型の色々な型クラスやパターンが「なぜそういう仕組になっているのか?」という根本的な考え方から説明しています。逆に、それしか説明していません!
つまり、考え方だけ説明して、その後「実際にはScala標準ライブラリや、〇〇というライブラリにこういうものがあるので、ここからはそれの具体的な使い方を説明します」という流れがほとんどありません。そのあたりがとにかく徹底していて潔いです。


細かいScala自体の言語仕様やテクニック*3、(標準ライブラリと外部のライブラリ含めた)既存の実在するライブラリの使い方は一切説明せず、とにかく「考え方や概念」のみを重点的に説明しているので、この本を読んで身につけた知識は古くなりにくいという点はあるとおもいます。




以下、それぞれの章毎に細かく感想というか、具体的な内容書いていきます。

1. What is functional programming?

この章は無料で公開されてます。短いですし、副作用とか参照透過性の話が簡単にあるだけです。

2. Getting Started

半分以上は、この本で必要になるであろう、最低限のScalaの基本的な文法の説明です。本当に最低限なので、説明しないこといっぱいあります。あとは、カリー化とか末尾再帰最適化とかそういうのです。そのあたりわかってる人は、1章と2章は読み飛ばして後で読んでもいいかもしれません。

3. Functional data structures

ここからやっとある程度本格的な説明に入るといった感じです。まず(Scala標準ライブラリのList使わずに)List自体と、Listに関する関数を自作しながら説明してます。List関係が半分以上で、最後のほうにはTreeの話出てきます。

4. Handling errors without exceptions

具体的にはOptionとEitherの話です。もちろんこれも、Scala標準ライブラリのものは使いません。Eitherに関しては、標準ライブラリのものとは違い、直接mapが呼べる*4ような*5かたちのものを作って説明してます。

5. Strictness and laziness

まず最初にStrictやlazyという概念自体の説明がわりと丁寧にされてます。その後は、Streamの説明です。これも大体Scala標準ライブラリのものと同じものですが、Scala標準ライブラリのものは使いません。

6. Purely functional state

5章までは、ほぼScala標準ライブラリにも存在するものなので、わりと入門的でしたが、ここでいきなりState Monadがでてきます。最初からState Monadという名前だすのではなく、java.util.Randomを使ったランダムな数の生成を例にして、「どうすればPurely functionalに状態を扱えるか?」というのを*6説明していって、State Monad自体を作りながら説明する感じです。

7. Purely functional parallelism

この章で最終的にでてくるものはFutureなわけですが、前の章と同様に、わざとFutureという言葉を出さずに、Future自体を一から作成していきます。もちろん標準ライブラリのFutureは使いません

8. Property-based testing

Scalacheckっぽいものを同じく一から自作・・・。

9. Parser combinators

もちろんScala標準ライブラリのParserは使わずに、一から自作・・・。例としてJSONのparsingなど

10. Monoids

やっとこの章から型クラスの説明。Monoidと、Foldableもでてきます。もちろんMonoidのlawとか説明します*7

11. Monads

最初にFunctorを簡単に説明したあと、Monadの説明。
流石にこのMonadの章や、次のApplicativeの章は少し天下り的な説明になってしまう部分がある気がします。

12. Applicative and traversable functors

「実はFunctorとMonadの間にApplicativeがあるんだよ」という感じで(?)、Applicativeについては、Monadの後に説明でてきます。Applicativeの例として、Validationがでてきます*8
後半はTraversableの型クラス。

最後のほうで、Monadが合成できない話とか、MonadTransformer(例としてOptionT)の話がでてきますが、オマケ程度で、あまりそのあたりは詳しくないです。

13. External effects and I/O

IOモナド。と、Trampolineなど。
そして、再びFutureの話もでてきます。そして、よく見るとこのFutureが最近Scalaz7のM9から新しく入ったFutureと大体同じです。
(MEAPのv9の時点の244ページと、Scalazのこれ 見比べてみてください)
単純なIOモナドの話だけではなく、後半色々と今までの章と関連する話や、java7のnio使ったり、他の章に比べると具体的な実践的な実装の話が多く出てきます。

14. Local effects and the ST monad

唯一この章だけまだ。公開されたら感想書くかも

15. Stream processing and incremental I/O

Iterateeでもなく、Conduitでもなく、Pipeでもなく、

もしくは

っぽいものの話。

13章と15章はあきらかに(それらを実装した) @pchiusano さんが書いたのだろうと思われますが、他の章と少し違う感じがあります。




個人的には、もうちょっとMonadTransformerとかLensとか、他の型クラス(MonadPlus、Comonad、Zipper、Free、Orderなどは出てこない?)の説明とか欲しかったですね。

*1:もちろん関数型の考え方を学ぶとことで、Scalazを学ぶ足がかりとしてはちょうどいいとは思いますが

*2:例えば、Monad、Applicative、Monoidなどの型クラス

*3:例えばtagged typeとかScala固有の残念なテクニックの説明とかしません

*4:Rightの場合にmapされる

*5:Scalazに近い

*6:ある意味わざとらしく?

*7:Monoidに限らず、この後のMonadやApplicativeについてもlawの説明などは同様にしっかりしてます

*8:ScalazのValidationを一部簡略化したようなもの