はすけるで遊ぶ

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

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

Haskell とは

(2008.11.7 この節を追加。)

関数型プログラミング

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

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

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

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

ちゃんとした解説は、例えば、次。

一つ目: 函数プログラミングのエッセンスと考え方 [2012年5月] 応用事例の紹介もある。

二つ目:

120901fp key from ksknac

Haskell の特徴

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

遅延評価では, 例えば、リストで最初の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
ファイルから読み込んだりエラー処理 (例外) について。

文法ふたたび

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

データ構造

次のメモはC++メインですが、前半でHaskellのMaybeモナドを解説しています。

薔薇木
木に対する操作。
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
書籍のテキストを一般公開。実用的な例が豊富。

外部リンク

コマンドラインオプション

Haskellスクリプトをコンパイルして実行したときに、コマンドラインオプションを取れるようにしたい。

do ... は、手続き型言語のように上から順に実行する。<- は変数に代入する。

import System          -- getArgs

main = do
  args <- getArgs      -- argsは[String]型になる
                       --     x <- getLine と書くと、コンソールから読み込む
  putStrLn (show args)

実行結果はこう。

$ ./main.exe foo bar --list=hoge
["foo","bar","--list=hoge"]