私のためのHaskell〜 [] リストを理解する その2

  • だんだんに性質を付与する
    • リストには、Functorという型クラスの性質と、Applicativeという型クラスの性質とMonadという型クラスの性質が付与されていた。
    • この3つの型クラス、その性質はには順序がある。
  • Functor型クラスの性質が1番はじめで、次がApplicative、その次にMonad、という順序である。
    • その順序は、Applicative型クラスの定義において、Functor型クラスであることが前提になっていること、Monad型クラスの定義において、Applicative型クラスであることが前提になっていることが以下の宣言から読み取れる。
class  Functor f  where

class Functor f => Applicative f where

class Applicative m => Monad m where
    • 結局、リストは
      • 要素ごとに関数を適用して、その結果をリストに納める処理を満足すると言う意味でFunctor型クラスの性質を持ち
      • さらに、関数を要素とするリストと、その関数の引数になるものを要素とするリストから、要素関数を要素に適用した結果をリストにして返すことができると言う意味で、Applicative型クラスの性質を持ち
      • さらに、関数の引数を要素とするリストを第1引数とし、その要素を引数としてリストを返す関数を第2引数として、各要素をリストにしたうえで、その全体を要素として返す性質ができた。
Prelude> :type fmap
fmap :: Functor f => (a -> b) -> f a -> f b
Prelude> :type (<*>)
(<*>) :: Applicative f => f (a -> b) -> f a -> f b
Prelude> :type (>>=)
(>>=) :: Monad m => m a -> (a -> m b) -> m b
Prelude> (<*>) [(+2), (+ (-2))] [1..3]
[3,4,5,-1,0,1]
Prelude> (>>=) [1..3] (\ x -> [x,2*x])
[1,2,2,4,3,6]
    • モナドの必須2関数
      • (>>=)はbind関数。受け取ったモナド型を保って返す。
      • returnは、受け取った型に限らず、引き渡す関数の引数に合わせた型を返す。以下のように受け取る型 a に対して返す型がm a (a を持ったモナド)になっている。
*Main> :type return
return :: Monad m => a -> m a
      • どちらも、モナドをつないでいくときに重要・便利な性質。