twitter buttonfacebook buttongoogle plus buttonhatena bookmark buttonpocket button
ちょっと小さいのはたしかですが。
2015年4月9日

関数型なAltJS、PureScriptの入門書を邦訳しました。

JavaScriptHaskell関数型言語altjspurescript


**追記: この翻訳は超古いです。本文中のサンプルコードの多くは、最新版のコンパイラではコンパイルが通りません。最新の情報については、原著を参照してください。**基本的な概念は変わらないので、この翻訳もまったく参考にならないというわけではないと思いますが、なるべく原著を読むことをおすすめします。

現在のPureScriptでの開発環境構築については、純粋関数型プログラミング言語PureScriptのはじめかた/コンパイラの使いかたからサーバサイドアプリケーション・クライアントサイドシングルページアプリケーション開発までの記事も併せてご覧ください。


Haskellライクな関数型プログラミング言語PureScriptの入門書、"PureScript By Example"を邦訳しました。本書はPureScriptのオリジナルの作者であるPhilさん本人が執筆した入門書です。本書を理解するにはJavaScriptを知っていることが望ましいですが、そうでなくともすでに何らかのプログラミング言語を知っていれば読みこなすことはできると思います。PureScriptはHaskellを始めとした多くの関数型言語と様々な考え方を共有していますから、PureScriptという言語そのものを学ぶという目的でなくとも、関数型プログラミング全般についての入門としても読むにも適しています。無料ですので、ぜひ読んでみてください。

原著も以下のページで無料で読めます。翻訳ミスが疑われたり、翻訳が読みにくい箇所があれば、原著にあたってみてください。原著は購入することもできますので、本書が気に入った方はぜひ購入してみてください。

本書の内容

タイトルの通り、本書はとにかく具体的なコードをばんばん見せてから、それに添って説明していくというスタイルです。すべてのサンプルコードはオンラインで入手できますし、演習もついていますので、実際に手を動かしながら理解を深めることができます。言語仕様を端からがっつりという感じではありませんし、数学的な定義がどうのこうのという抽象的な話もほとんどありませんから、比較的取り組みやすいのではないかと思います。扱うサンプルコードは次のような実用性の高いものばかりです。

  • 住所録アプリケーション
  • 2次元平面上を歩いてアイテムを集めるテキストベースのアドベンチャーゲーム
  • HTML5 Canvas APIを使ったCanvasへのグラフィックス描画
  • HTMLフォームに入力されたデータの妥当性検証
  • QuickCheckによるランダムなユニットテストの自動生成
  • JSONデータの型安全な読み取り
  • 非同期処理のための領域特化言語によるコールバック地獄の解消
  • 安全なページ内リンクを可能にした、HTMLテンプレートとしての領域特化言語の開発

関数型言語の入門のサンプルコードは、パズルでも解いているかのような実用性が感じられないものばかり取り沙汰されることがありますが、その点、本書は関数型プログラミングを現実の開発でどのように実用していくかを常に念頭に置きながら学習できます。標準入出力だけで済ませるような地味なものだとモチベーションが上がらない人もいるでしょうが、PureScriptコードはJavaScriptコードへとコンパイルできるので、Canvas APIでグラフィックスを扱ったりAjaxで通信してみたりと、比較的派手なことがしやすいのも魅力です。

開発環境のインストールから、対話式環境の操作、gruntを利用したビルドやテストの自動化まで取り扱っています。関数型プログラミングの概念や言語仕様だけでなく、開発の一連の流れについての包括的な解説になっています

Haskeller向けのあれこれ

Haskellを知っている人向けに、本書でどのような話題を扱っているかキーワードとして挙げておきます。FreeモナドExtensible Effectsのような比較的新しい話題も扱っていますから、すでにHaskellに馴染みがある人にとっても参考になるかもしれません。

  • 関数、レコード(JavaScriptのようなオブジェクト)、再帰、代数的データ型
  • マップ、畳込み、パターン照合、ポイントフリースタイル、多相型、行多相
  • 関手、Applciative、モナド、モナド変換子、モナドスタック、MonadTrans
  • 各種の型クラスや基本的なモナド(Reader,Writer,State,ST,Either,Error,Eff,Monoid,Alternative,MonadPlusなどなど)、do記法
  • 拡張可能作用(Extensible Effects)、ファントム型、ランクN多相
  • Foreign Function Interface、PureScriptのデータ型の実行時表現
  • QuickCheck、Arbitrary型クラス、CoArbitrary型クラス
  • Freeモナドを利用した領域特化言語の実装

PureScriptはHaskellに強い影響を受けていますが、決してHaskellのサブセットやHaskellそのものを目指しているわけではありません。HaskellとPureScriptの決定的な違いとしては次のような点が挙げられます。

  • 正格評価
  • ネイティブな副作用のモナドがIOじゃなくて、Extensible EffectsであるEff
  • JavaScriptへとコンパイルされる(実験的なC++バックエンドもあるようです)
  • レコード型(JavaScriptのような『オブジェクト』)と行多相

そのほか、forallが必須だったり、リスト内包表記がなかったりと微妙な違いがいろいろありますが、よく訓練されたHaskellerならそのうち慣れると思います。逆に言えばそれ以外はHaskellそっくりで、QuickCheckなどのライブラリはHaskellから移植して使っているようです。型クラスまわりの表現力はHaskellに近いレベルのものが確保されており、Functor/Applicative/Monad という階層や、MonadTransのような型クラスもしっかり実現されています。

注意

今のところ邦訳のデータはBitBucketに置いていますが、そのうちGithubのほうに移動したりするかもしれません。URLはもしかしたら変わるかもしれないのでご注意ください。まだ訳が硬くて読みにくい部分も多かったり、誤訳も多いかと思われますが、そのうち直していこうかなと思います。誤訳があればすべて私個人の責任です。もし邦訳の内容に問題を見つけたら、このqiitaのページにコメントを残して頂くと私が気が付きやすいです。

さいごに

英語なら関数型プログラミングの資料はたくさん手に入りますが、やはり英語と日本語だと読む速度が何倍も違ってきます。Haskellについては日本語でもすでに良い入門書が何冊も出版されていますが、本書の内容はそれらに比肩するたいへん充実したものです。そしてなにより無料で読めますから、気が向いた時や暇なときに気軽に読んで頂けたらと思います。書籍にはどうしても肌に合う合わないがありますから、市販の本を買って馬が合わずに損した気分になるより、まずは関数型プログラミングに無料体験してみるのはどうでしょうか。関数型プログラミングに本気で取り組むぞというほどの気概がなくて、関数型プログラミングはなんぞやということをちょっとかじりたいだけの人にもお勧めです。

おまけ・無料関数型プログラミング書籍特集

本書だけでは物足りない、まとまった量の関数型プログラミング入門テキストが欲しい!でも紙の本をお金出して買うほどじゃないという人向けの、無料で読める関数型プログラミング関連の書籍をまとめておきます。他にもあったら教えて下さい。

  • やさしいHaskell 入門 - 私がHaskellをいじり始めたときには日本語の書籍が出版されていなかったので、私はこれでHaskellに入門しました。ちょっと古いですが、入門用としてはさほど問題無いと思います。『やさしい』……?

  • Learn You a Haskell for Great Good! - 英語ですが、表紙のポップなゾウさんが目印の可愛い本です。可愛さに釣られて手に取る人が続出しています。比較的新しい本なので安心です。

  • 計算機プログラムの構造と解釈 - とても有名な古文書です。Schemeは知っておいて損のない言語ですし、Haskellを学ぶのとはまた別の~~新たな性癖に目覚める~~新しい世界が見えてくるかもです。和田さんのSICP邦訳とは別に、新たに邦訳が公開されたようです。やったぜ。http://vocrf.net/docs_ja/jsicp.pdf

  • 型システム入門 プログラミング言語と型の理論 - 無料で読めるのは第一章だけですが、それだけでも読む価値があります。プログラムについて重要な直感を与えてくれると思います。