Haskell ワンライナー

Hugs で Haskell のプログラムを作る練習をしようと思っても、いちいちファイルに作成するのが面倒だ。次のワンライナーなら Hugs のコマンドラインから実行できるので、何回も打ち込んで試しているうちに自然に Haskell の使い方が身につく。

練習用の一行プログラムは、階乗・フィボナッチ数・素数・順列・組み合わせ・配列の長さ・クイックソート・要素の挿入・Maybeモナド・IOモナドの10のプログラムだ。これらを毎日1回空で作成できるようになれば、Haskell はかなり楽しくなる。

階乗の計算(基本的な再帰関数)
Hugs> fact 5 where fact 0 = 1; fact n = n * fact (n-1)
120

フィボナッチ数(:演算子と tail と高階関数 take, zipWith の使いかた)
Hugs> take 10 fib where fib = 0:1:zipWith (+) fib (tail fib)
[0,1,1,2,3,5,8,13,21,34]

素数(リストの再帰関数、リストの内包的定義、$演算子の使いかた)
Hugs> take 10 $ sieve [2..] where sieve (x:xs) = x:sieve [y|y <- xs, y `mod` x /= 0]
[2,3,5,7,11,13,17,19,23,29]

順列(多分木の再帰関数、内包的定義のパワー。注意:delete が Prelude の標準関数ではないので、Hugs のコマンドラインで :load List としてListモジュールに移動する必要がある。)
List> perm "abc" where perm [] = [[]]; perm xs = concat [map (x:) $ perm (delete x xs)| x <- xs]
["abc","acb","bac","bca","cab","cba"]

組み合わせ(引数が複数の時の再帰関数)
Hugs> comb "abc" 2 where comb _ 0 = [[]]; comb [] _ = []; comb (x:xs) n = map (x:) (comb xs (n-1)) ++ comb xs n
["ab","ac","bc"]

配列の長さ(ワイルドカードの使いかた)
Hugs> mylength [1,2,3] where mylength [] = 0; mylength (_:xs) = 1 + mylength xs
3

クイックソート(左右の再帰)
Hugs> qsort [2,5,8,1] where qsort [] = []; qsort (x:xs) = qsort (filter (<x) xs) ++ [x] ++ qsort (filter (>=x) xs)

要素の挿入(let の使い方)
Hugs> insertAt 'X' "abcd" 2 where insertAt x xs n = let(ys,zs) = splitAt n xs in ys ++ [x] ++ zs
"abXcd"

Maybe モナド(モナドのプログラム)
Hugs> Just 2 >>= double where double x = return (x + x)
Just 4

IOモナド(入出力の基本)
Hugs> do cs <- getLine; putStrLn cs
hello, world
hello, world

その他のワンライナー

ファイルの書き込み
Hugs> writeFile "hello.txt" "hello, world"

ファイルの読み込み
Hugs> do cs <- readFile "hello.txt"; putStr cs
hello, world

データのシリアライズ
1.書き込み
Hugs> writeFile "array.txt" (show [1,2,4,6,7])

Hugs> readFile "array.txt" >>= putStr
[1,2,4,6,7]

2.読み出し
Hugs> do cs <- readFile "array.txt"; print $ sum ((read cs)::[Int])
20
[PR]
by tnomura9 | 2009-08-31 23:18 | Haskell | Comments(0)
<< Haskell と式の展開 やさしい Haskell 入門 >>