駆け足で読む『プログラミングHaskell』10 型とクラスの定義

  • 型を定義する
    • typeによる宣言(既存の型を使って宣言する)
type String = [Char]
type Pos = (Int, Int)
type Board = [Pos]
    • dataによる宣言(まったく新しい型を宣言する)
      • 取りうる値の集合を定義する
        • その上で関数を定義する
data Move = Left | Right | Up | Down
-- 2次元の格子型の動きは4つの要素からなる集合
move :: Move -> Pos -> Pos
move Left (x,y) = (x-1,y)
move Right (x,y) = (x+1,y)
move Up (x,y) = (x,y-1)
move Down (x,y) = (x,y+1)

moves :: [Move] -> Pos -> Pos
moves [] p = p
moves (m:ms) p = moves ms (move m p)

flip :: Move -> Move
flip Left = Right
flip Right = Left
flip Up = Down
flip Down =Up
      • 再帰的にも定義できる
  • クラスの定義
    • classを用いて宣言
      • classは型を要素とするので、帰属する型も書く
      • 帰属する型が満足するメソッドを宣言する
      • その上で、帰属する型ごとにメソッドに対応する表現を書く(インスタンスの行を書く)
    • インスタンスを引き継ぐにはderivingを使う
  • モナド型の宣言
    • IOのところでも書いたように、モナド型はモナド型と他の型のペアを作ったり、順序をつけて処理をしたり、という特定のルールがあるので、それに関する記載のルールがある