すごいHaskell 第2章メモ
第2章 型を信じろ!
「すごいHaskell 楽しく学ぼう」 第2章を読みながらのメモです。 この章はHaskellにおける型や、型クラスについて書いてある。 型クラスについてはあまり理解していないが、今はサラッと流すことにする。
型の調べ方
GHCi上で型を調べる場合は、:t 式を入力すれば、型が表示される。 下の出力結果の :: は「の型を持つ」と読む。明示的な型の名前は大文字から始まる。
Prelude> :t 'a' -- 'a' :: Char Prelude> :t True -- True :: Bool Prelude> :t "Hello" -- "Hello" :: [Char] Prelude> :t (True, 'a') -- (True, 'a') :: (Bool, Char) Prelude> :t 4 == 5 -- 4 == 5 :: Bool
関数も型を持つ。
Prelude> let removeNoneUppercase st = [ c | c <- st, c `elem` ['A' .. 'Z'] ] Prelude> :t removeNoneUppercase -- [Char] -> [Char]
※GHCiで変数宣言をするときは let を忘れないように。また、中置関数に変換する ときはアポストロフィー(')ではなく、バッククオート(`)なので注意!
- 明示的に型を宣言する場合は :: の後に型を書く。
GHCiで関数に型を宣言する場合、
StackOverflow
に書いてあるように、型宣言をした後に、セミコロンで関数定義を書くという方法がある。
他にも monomorphism restriction をオフにする方法もあるようだ。
let removeNoneUppercase' :: [Char] -> [Char]; removeNoneUppercase' = removeNoneUppercase
一般的なHaskellの型
型 | 説明 |
---|---|
Int | 有界な整数 |
Integer | 有界ではない整数 |
Float | 単精度浮動小数点 |
Double | 倍精度浮動小数点 |
Bool | 真偽値 |
Char | Unicode文字 |
型変数(type variable)
ほかの言語でいうところのジェネリクス。下の例では、a、bが型変数。 型変数を用いた関数を多相的関数という。 headやfstは多相的関数。
Prelude> :t head -- head :: [a] -> a Prelude> :t fst -- fst :: (a, b) -> a
型クラス(typeclasss)
型クラスは振る舞いを定義するインターフェイスのようなもの。具体的に言うと、関数の 集まりを定める。Javaのインターフェイスのようなものか・・・。
- よく使われる型クラス一覧
型クラス | よく使う関数 |
---|---|
Eq | ==, /= |
Ord | >, <, >=, <= |
Show | show |
Read | read |
Enum | succ, pred |
Bounded | maxBound, minBound |
Num | +, -, * |
Floating | sin, cos, tan, sqrt |
Integral | fromIntegral |