ようこそ。睡眠不足なプログラマのチラ裏です。

Haskellのお勉強 その2

静的型チェック

Haskellにも、Javaや.NETと同じように静的な型チェック(static type checking)がある。
「静的な」というのは、「コンパイル時に」と同じ意味であるから、
Haskellの場合もコンパイル時に、処理系が型のチェックを行ってくれる。
このようにコンパイル時型のチェックを行う言語を静的型付けの言語と呼び、
また、実行時にならないと型がわからない言語を動的型付けの言語という。


型推論

型推論とはプログラミング言語の機能の1つで、静的型チェックを持つ言語において、
変数や関数の型を宣言しなくとも、それを導くのに使われた関数の型シグネチャなどから
自動的に型を決定する機構のことである。よって、型推論の機構をもつプログラミング言語では、
型を宣言することなくコンパイルすることが可能。また、推論に失敗するとその時点でエラーが報告されるため、
少なくとも誤った型を用いる事によるバグを回避できる。
また、プログラムの記述についてアルゴリズムのみに集中することができるので、
プログラムの抽象度がより高まるというメリットもある。


関数の型

Haskellでは引数の型と戻り値の型の組み合わせで関数の型が表現される。

第1引数の型 -> 第2引数の型 -> .... -> 戻り値の型

という具合。

型変数(type variable)と多相型(polymorphic type)
下記は、lenght関数の型を示している。

{-length関数の型-}
lenght :: [a] -> int

[a]という表記がある。[○○]は○○型のリストであるから、
a型のリストだということはわかる。だだ、aって一体どっから出てきたの?という話。
このaは、型変数と言い、どんな型と置き換えてもよいことを表すために用いられる。
これは、aはなんでも好きな型に読み替えてもOKということである。
型変数には「a」に限らず、アルファベット小文字で始まる識別子ならなんでも使うことができる。
ただし、Haskellでは型変数にa,b,c,...を用いるのが一般的慣習となっている。


また、型変数を含む型のことを多相型と呼ぶ。
よって、length関数は多相型の引数を取る多相型の関数ということができる。


take関数の関数の型について見てみる。

{-take関数の型-}
take :: int -> [a] -> [a]

take関数では、[a]という2つの型変数が用いられている。
take関数は、ある型のリストの先頭から、指定した数値の個数分を含むリストを返すというもの。
よって、関数の意味を考えれば当然であるが、このとき[a]には同じ型があてはめられる。
[a]は[Char]であったり[String]であったり[Bool]であったりする。


Haskellで定義されている関数の型の例

length :: [a] -> int
reverse :: [a] -> [a]
take :: int -> [a] -> [a]
words :: String -> [String]
lines :: String ->[String]
unlines :: [String] -> String

print :: (Show a) => a -> IO()
putStr :: String -> IO()
putStrLn :: String -> IO()

putStr関数などについている「IO()」やprint関数の「(Show a) =>」などは
9章と11章でお勉強することになるとのこと。