はすける Haskell で遊ぶ

(2005.7.18 新規作成, 2009.1 更新。)

関数型プログラミングのための言語 Haskell について。

[2022-09] 処理系が GHC --The Glasgow Haskell Compiler-- だけになってしまってずいぶん経つ。仕様も Haskell 2010 language 以降、纏められなくなってしまった。見通しはあまり明るくない。

Haskell とは

(2008.11.7 この節を追加。)

関数型プログラミング

例えばC言語でもオブジェクト指向プログラミングができます (gtk+など) が、プログラミング言語の支援があったほうが自然にプログラミングできます。

Haskell あるいはほかの関数型プログラミング言語 (Clean, O'Caml, Scala, Erlang など)は、関数型プログラミングがしやすいようなプログラミング言語です。程度問題で, 何か決まった境界があるわけではない。

関数型プログラミングは、関数を中心にプログラムを組み立てていくもので、次のような特徴があります。

  • 関数が第一級のオブジェクト. 関数自体を他の関数の引数としたり、戻り値としたりできる。
  • 高階関数 (higher-order function) を多用
  • 変数の再代入を行わない
  • 代数的データ型と, 型によるパタンマッチ
  • オブジェクトの書き換えを行わない (ことが多い)
  • ループ構文を使わない (ことが多い)

変数とオブジェクトの書き換えをおこなわないことで、バグの減少と, 並行処理が容易にできる可能性があります (concurrent computing)。

関数型プログラミングとは何か、については、例えば次のスライド; 函数プログラミングのエッセンスと考え方

Haskell の特徴

Haskellは、上の特徴に加えて、次のような機能があります。

  • 式が遅延評価 (Lazy evaluation)
  • 参照透過性
  • 型推論

遅延評価では, 例えば、リストで最初の5要素しか必要でなければ、6番目以降の要素はそもそも計算されません。

準備

らむだ ruby -> haskell (PDF)
(2008.7.19) Rubyist九州ミーティングで、Rubyプログラマ向けにHaskellを紹介しました。
Haskell vs Ruby
HaskellとRubyとで、プログラムの書き方がどのように変わるのか。
Haskell環境の用意
GHCなどのインストール. インタプリタ ghci.
Haskellのパッケージシステム (Cabal)
追加パッケージをすばやくインストール。
Haskell Stack でライブラリを安定させる
cabal-install と併用して、プロジェクトごとに依存ライブラリのバージョンを固定。

基本

はろーわーるど
最初の一歩。
Haskellの字句構造・キーワード
文法の説明その1. コメント、識別子とキーワード、演算子の文字、レイアウトルール.
Haskellの基本データ型 -- Bool, 数値
組込み型についてのメモ。
文字列, テキスト型
文字(列)やバイト列の扱い
テキスト型の周辺
Unicode正規化, 文字コード変換, 正規表現
リストの操作
組込みのリスト操作関数。
モナド, 具象データ型, モナド則の嬉しさ
HaskellのファイルIO
ファイルから読み込んだりエラー処理 (例外) について。
Haskellの例外処理
Java などでの try-catch-finally 構文が, Haskell ではどうなるか。

文法ふたたび

データ型・型クラス・型族
do記法
モナドの使い方のさわりも。
演算子
パターンマッチ
引数パターンマッチなど
Haskell での多態 (多相)
C++のテンプレートに近いHaskellの多態。Java/C++の抽象クラスのようなアドホック多相。

データ構造・永続化

次のメモはC++メインですが、HaskellのMaybe モナドを真似しています; C++でMaybeモナド (std::optional)

薔薇木
木に対する操作。
HTMLの組み立てかた (Shakespeare Hamlet)
テンプレートエンジンでHTMLを作成. 字下げで入れ子を表現。制御構造も書ける。
Haskellでデータベース操作
RDBMSにSQLを投げる。Haskell cabalパッケージの扱い。
型安全な Persistent を使う
型を駆使して, 安全に SQLを書ける O/Rマッパ。

その他小ネタ

HaskellでFizzBuzz問題
小さな問題をHaskellで。

図書

『すごいHaskellたのしく学ぼう!』 (2012年)

本物の入門書。

原著はオンラインでも読める (無料). Learn You a Haskell for Great Good!

『ふつうのHaskellプログラミング -- ふつうのプログラマのための関数型言語入門』 (2006年)

(2017.2) 紙は絶版になっているようだ。オンデマンド版ペーパーバックというのは, まだ入手できる。

Haskellの初歩から文法、勘所まで着実、丁寧に解説した、非常に優れた本。これを読めばHaskellを読み書きできるようになること間違いなし。

Haskellの考え方に触れることで、Java / C++ / Ruby / Pythonなどほかのプログラミング言語でプログラミングするときでも再利用しやすく、保守しやすいコードを書く参考になる。

お薦め。

これらで入門した後は、実践的な内容のものがいいが、下のはちょっと古い。Webで探した方がいいかも。

Real World Haskell
書籍のテキストを一般公開。実用的な例が豊富。

外部リンク