Haskell プログラミング入門
【関連する外部ページ】
リファレンスマニュアルの入手先は→ http://haskell.org/haskellwiki/GHC:Documentation
インタプリタの起動
ghci コマンドでインタプリタを起動する.「:quit」または「:q」または「CTRL + D」(同時押し)で終了する.
ghci
評価
式から値を得ることを評価という.式と値については後述する.式から得られた値を,その式の評価結果という.
四則演算
四則演算: +, -, *, /
2 * 3
10 + 20
3 / 5
1 / 3
10 - 20
べき乗: ^
2 ^ 10
かっこの内側が先に評価される.
1.05 * (10 + 20 + 30)
整数に関する演算
- succ
関数と関数適用
複数の式を一般化して「ラムダ 仮引数の並び 本体式」の形で表現したものを関数抽象(ラムダ抽象)という.
関数は引数と戻り値の間に対応関係を持つ.
関数適用では,仮引数を実際の値に束縛し,本体式を評価する.
以下の例では,関数 (\ x -> x * 1.05) に値 100,値 200,式 (100 + 200 + 300) を適用している.
1.05 * 100
1.05 * 200
1.05 * (100 + 200 + 300)
(\ x -> x * 1.05) 100
(\ x -> x * 1.05) 200
(\ x -> x * 1.05) (100 + 200 + 300)
値としての関数
式と値,ファーストクラスオブジェクト
変数を値に束縛できる.これにより変数と値が結びつく.束縛された変数は変数名で参照できる.
let を用いた束縛の例を示す.
let foo = 100
let ans = True
let name = "kaneko"
関数も値である.値にはさまざまな型がある.
let foo n = 2 ^ n
foo 10
foo 12
記号 => は簡約の過程を示す.左辺は式,右辺は式または値である.値はそれ以上簡約できない.
値の種類
- 数値:
整数型には Integer(任意精度)と Int(固定精度)がある.浮動小数点型には Float と Double がある.数値リテラルの型は文脈に応じて推論される.
数値に関する関数の例: abs(絶対値),negate(符号反転),div(整数除算),mod(剰余),fromIntegral(整数型変換)
- 文字列:
文字列は文字のリストである.型は String であり,[Char] の型シノニムである.文字列リテラルはダブルクォート,文字リテラルはシングルクォートで囲む.
- ブール値:
Bool 型は True と False の2値を持つ.論理演算子として &&(論理積),||(論理和),not(否定)がある.比較演算子(==,/=,<,>,<=,>=)は Bool 型を返す.
- リスト:
要素の並びをまとめたデータ構造である.
リストに関する関数の例: length(リストの要素数), take(リストの先頭から任意個数の要素を取得.結果はリスト), reverse(リストの逆転.結果はリスト), head(リストの先頭要素), tail(リストの第2要素以降.結果はリスト)
take,head,tail における実行時エラーについては後述する.
- タプル:
タプルは固定個数の要素をまとめたデータ構造である.各要素は異なる型を持てる.例えば (1, "hello") は Int と String の組である.要素数2のタプルには fst(第1要素の取得)と snd(第2要素の取得)を使用できる.
- 関数:
関数は第一級オブジェクトである.関数を変数に束縛する,引数として渡す,戻り値として返すといった操作が可能である.
データ型
Haskell は静的型付け言語であり,すべての式の型はコンパイル時に決定される.型推論により,多くの場合は型を明示しなくてもコンパイラが型を決定する.
型を明示する場合は :: を用いる.例えば x :: Int は変数 x が Int 型であることを示す.
ghci では :type コマンド(略記 :t)で式の型を確認できる.
副作用
副作用とは,計算の過程で外部とのやり取りを行うことである.画面表示やキーボード入力が該当する.
print による画面表示の例を示す.
readLn によるデータ入力の例を示す.
再帰関数
ghci で複数行にわたる定義を入力する場合は :{ と :} で囲む.
:{
let
kaijou 0 = 1
kaijou n = n * kaijou (n - 1)
:}
kaijou 5
遅延束縛