2. 基本概念 型とは? 互いに関連する値の集合 例: Bool型はFalseとTrueという値を持つ v :: T 「vは型Tの値である」 例: False :: Bool not :: Bool -> Bool -- Bool型をBool型に変換する関数の型 not True :: Bool 型推論 関数適用の型付け規則:f :: A -> B かつ e :: A ならば f e :: B すべての式は型を持たなければいけない 推論できない式(例: not 3)は型エラーとなる Haskellは事前に型検査をおこなうので型安全である(型安全だからといってエラーがないわけではない: 1 `div` 0)
3. 基本概念(続き) GHCのコマンド :type (Hugsと同じ) :t とも書ける GHCでのセッション例:*Main> :type notnot :: Bool -> Bool*Main> :t not Falsenot False :: Bool*Main> :t not 3<interactive>:1:5:No instance for (Num Bool)(以下略)
13. 多重定義型 加算演算子 +IntやFloatなどの数値型の足し算ができる> 1 + 23> 1.1 + 2.23.3 クラス制約: 「どんな数値型にも」というような制約を表す 書き方 C aC: クラス名、a: 型変数 「クラスCのインスタンスであるどんな型aについても」 (+) :: Num a => a -> a -> aNumクラスのインスタンスであるどんな型aについても加算演算子(+)の型はa -> a -> aである
14. 多重定義型 (続き) 例: (-) :: Num a => a -> a -> a negate :: Num a => a -> a abs :: Num a => a -> a 数値自体も多重定義されている3 :: Num a => a
15. 基本クラス クラス 共通のメソッド(多重定義された関数)を提供する型の集合 クラスのインスタンス: クラスの要素 Eq: 等しいかどうか判定できる 以下のメソッドが定義されている (==) :: a -> a -> Bool (/=) :: a -> a -> Bool Bool, Char, String, Int, IntegerなどはEqのインスタンス Eqのインスタンスのリスト、タプルもEqのインスタンス 関数型はEqクラスのインスタンスではない
16. 基本クラス (続き) Ord: 順序がつけられる Eqクラスのインスタンスであり、以下のメソッドが定義されている (<) :: a -> a -> Bool (<=) :: a -> a -> Bool (>) :: a -> a -> Bool (>=) :: a -> a -> Bool min :: a -> a -> a max :: a -> a -> a Bool, Char等はOrdのインスタンス Ordのインスタンスのリスト、タプルもOrdのインスタンス(辞書式順序)
17. 基本クラス (続き) Show: 表示できる(文字列に変換できる) show :: a -> String Read: 文字列から変換できる read :: String -> a readの結果の型は文脈から決まる場合にはその型になるnot (read "False")のread "False"の型はBool 決まらない場合には結果の型を指定すればよい> read "123"<interactive>:1:1: Ambiguous type variable `a0‘ in the constraint:(中略)> read "123" :: Int123 目的の型に変換できないような文字列が入力されるとエラーになるnot (read "Hello")はエラーになる
18. 基本クラス (続き) Num: 数値 EqとShowのインスタンスであり、以下のメソッドが定義されている (+) :: a -> a -> a (-) :: a -> a -> a (*) :: a -> a -> a negate :: a -> a abs :: a -> a signum :: a -> a Integral: 整数 Numのインスタンスであり、以下のメソッドが定義されている div :: a -> a -> a mod :: a -> a -> a Fractional: 分数 Numのインスタンスであり、以下のメソッドが定義されている (/) :: a -> a -> a recip :: a -> a -- 逆数