Haskell とは
- 純粋関数型のプログラミング言語
- 変数を扱わないため状態という概念がない
- 非正格の遅延関数言語
- 強力な型システム
- 名前は数学者であり論理学者であるハスケル・カリーに由来
実行環境
http://haskell.org/hugs/ から Hugs を導入するのが楽ちんです。Windows 用の WinHugs をインストールすると以下のような環境で対話的にプログラミングが可能になります。
そのほか、コンパイラーが必要な場合には Glasgow Haskell Compiler があります。
Hugs で Help を表示させてみると以下となります。
Hugs> :? LIST OF COMMANDS: Any command may be abbreviated to :c where c is the first character in the full name. :load <filenames> load modules from specified files :load clear all files except prelude :also <filenames> read additional modules :reload repeat last load command :edit <filename> edit file :edit edit last module :module <module> set module for evaluating expressions <expr> evaluate expression :type <expr> print type of expression :? display this list of commands :set <options> set command line options :set help on command line options :names [pat] list names currently in scope :info <names> describe named objects :browse <modules> browse names exported by <modules> :main <aruments> run the main function with the given arguments :find <name> edit module containing definition of name :cd dir change directory :gc force garbage collection :version print Hugs version :quit exit Hugs interpreter
まずは、:load、:reload、:type、:quit ぐらいで問題ないです。:load は :l のように短縮コマンドが利用できます。
ごく簡単な例
Husg 上で足し算
Hugs> 2 + 3 5
リストから先頭の要素を取得
Hugs> head[1,2,3,4] 1
リスト要素の和
Hugs> sum[2,3,4] 9
簡単な関数の定義
Hugs 上では関数定義などが行えないため、関数を定義するには sample.hs などのファイルにプログラムを記載して、「:l sample.hs」のようにファイルをロードして Hugs に関数を読み込ませる必要があります。
WinHugs 上にファイルをドロップすると勝手に :load してくれるので楽です。けどパスに日本語が含まれているとうまくいかないです。
sample.hs に以下の関数を定義します。
double x = x + x triple x = x * 3
double という名前の関数と、triple という名前の関数を定義しました。
Hugs 上で以下のようにすると定義した関数が実行できます。
Hugs> :load "C:\\sample.hs" Main> double 2 4 Main> triple 2 6
もう少し込み入った例
先ほどの sample.hs に以下の関数を定義してみます。
qsort[] = [] qsort(x:xs) = qsort smaller ++ [x] ++ qsort larger where smaller = [a | a <- xs, a<= x] larger = [b | b <- xs, b > x]
Husg でファイルをりロードして qsort 関数を呼び出すと、
Main> :r "C:\\sample.hs" Main> qsort[4,7,8,2,6,0,9,1,3,5] [0,1,2,3,4,5,6,7,8,9]
クイックソートプログラムの完成です。エレガントだとは思いませんか?
Haskell の予約語
こんなもんです。関数名や引数名には利用できません。
case class data default deriving do else if import in infix infixl infixr instance let of module newtype then type where
コメント
一行コメントは「-- 」で始まり行末まで。複数行コメントは「{-」で始まり、「-}」までとなり、コメントは入れ子にできます。
レイアウト規則
Haskell ではブレースとセミコロンにてプログラム構造をあらわすことができますが、通常はインデントによるレイアウト揃えにてブロック構造を表します。キーワード where、let、do、of の後の構造はインデントすることでブレースを省略して記述できます。
前述のクイックソートの例では、smaller と larger が where 節のブロックに含まれることになります。
qsort[] = [] qsort(x:xs) = qsort smaller ++ [x] ++ qsort larger where smaller = [a | a <- xs, a<= x] larger = [b | b <- xs, b > x]
where 節は関数内にて where の次で定義した関数が利用できるため、smaller と larger はいずれも qsort 関数に属する形となります。
ブレースで表すと、以下のようにも記載できます。
・・ where { smaller = [a | a <- xs, a<= x]; larger = [b | b <- xs, b > x] }
blog1.mammb.com
に続く