Haskell 入門


ghci で全てを済ませたい

ソースファイルを作りたくない

Haskell の勉強をする時に一番便利なのは、ghci のコマンドラインにプログラムを打ち込んでその反応を見ることだ。自分の意図したことがうまくいくのか、そうでないのか、リアルタイムに知るのは気持ちがいいし理解も進む。

いちいちエディタを開いて修正して保存して、それを再ロードして試すという操作は、何回も繰り返していると、助けてくれと叫びたくなる。

Haskell Platform をインストールすれば、Windows でもヒストリー機能が付いているので、上矢印一発で先程入力したプログラムを修正できるから、余計にプログラムファイルを作りたくなくなる。

何でも ghci でやってしまう

そこで、何でも ghci でやってしまえないかいろいろと探してみた。

ガードが書ける

驚いたことに、ガードも ghci のワンライナーで使える。次の例は、階乗の計算をガードを使って定義したものだ。

Prelude> fact x | x == 0 = 1 | x > 0 = x * fact (x-1)
Prelude> fact 5
120

パターンが書ける

パターンを使った関数の定義も、ワンライナーでできる。

Prelude> len [] = 0; len (_:xs) = 1 + len xs
Prelude> len [1,2,3,4]
4

do 記法

複数行の do 記法だって、ワンライナーで書ける。

Prelude> do cs <- getLine; putStrLn cs
hello, world
hello, world

シェルコマンド

シェルのコマンドも ghci からできる。

Prelude> :! ls

定義した関数を見る

自分がどんな関数を定義したのか、検索できる。

Prelude> :show bindings
fact :: (Num a, Ord a) => a -> a = _
it :: () = ()
len :: (Num t1) => [t] -> t1 = _

ライブラリの検索

ライブラリの関数にどんなものがあるのか検索できる。

Prelude> :browse Text.Regex
matchRegex :: Regex -> String -> Maybe [String]
matchRegexAll ::
  Regex -> String -> Maybe (String, String, String, [String])
mkRegex :: String -> Regex

関数やライブラリの情報を確認できる。

Prelude> :info foldr
foldr :: (a -> b -> b) -> b -> [a] -> b -- Defined in GHC.Base
Prelude> :info System.IO.readFile
readFile :: FilePath -> IO String -- Defined in System.IO

ちょっと、満足。: )