タコさんブログ

プログラミングメモと小言

すごい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