tak0kadaの何でもノート

発声練習、生存確認用。

医学関連は 医学ノート

「Learn You a Haskell for Great Good!」第2章を読んだ

前回のまとめからかなり時間が経ってしまった。勉強会が硬直状態にあるので一気にまとめてしまって何とかしたい。

2章は型について。

Explicit Type Declaration

数値や真偽だけでなく、関数も型を持つ。(型は大文字始まりの名前がつく。)

:t 'a'
-- 'a' :: Char
:t False
-- False :: Bool
:t myfunc
-- myfunc :: Int -> Int -> Int

など。引数、戻り値は->で区切る。

Common Haskell Types

山田先生のブログに貼ってあった画像が分かりやすい。

haskell types

黄色に塗られたものが型である。外についてるラベルは型クラス。

Int, Integer, Float, Double, Bool, Char, (), (,), Orderingなどいろいろある。

Integerは他の言語と違って、任意の大きさの整数を表す。タプルも型で、要素の数が異なれば違う型になる。空のタプル()もひとつだけ値を取る型。

Type Variables

head :: [a] -> a

ここでのaは型変数と呼ばれ、型そのものではなく、任意の型を取れる。型変数を使った関数は多相的関数と呼ばれる。

Type Classes 101

型クラスは何らかの振る舞い(関数=メソッド)を定義するインターフェース。型を型クラスのインスタンスにすることでその振る舞いをできるようにする。

型クラス制約: 型の定義で=>より前の部分。

:t (==)
-- (==) :: (Eq a) => a -> a -> Bool
  • Eq型クラス
  • Ord型クラス

大小比較を定義する。compare関数は比較した結果をGT, LT, EQで返す。

:t compare
-- compare :: (Ord a) => a -> a -> Ordering
  • Show型クラス: 文字列を返す。
  • Read型クラス

Showの逆の型クラス。read関数はインスタンス型の値を返す(場合によっては自分で指定する必要あり)。

read "[1, 2, 3]" ++ [3]
-- [1, 2, 3, 3]
read "12" :: Int
-- 12
read "12" :: Double
-- 12.0

順番に列挙できるもの。

['a'..'e']
-- ['a', 'b', 'c', 'd', 'e']
  • Bounded型クラス

上限、下限があるもの。

minBound :: Int
-- -9223372036854775808(環境によって異なる)
  • Num型クラス 実数として振る舞える。
5 * (2 :: Integer)
-- 10
  • Floating型クラス

FloatとDoubleを含む。

:t sin 10
-- sin 10 :: Floating a => a
:t sin 10 :: Double
-- sin 10 :: Double :: Double

浮動小数点演算をする関数はFloating型クラスで定義する。

  • Integral型クラス: 整数として振る舞える。fromIntegralでNum型クラスの値に変換できる。

  • 注意