Haskell勉強会

関数型プログラミングの学習日記

圏論とダイクストラの構造化プログラミングの対応

YouTubeモナド圏論)の動画を見ていたら、興味深い説明がありました。

 

www.youtube.com

 

上記動画のスライド

 

speakerdeck.com

 

動画だと5分35秒あたり、スライドだと19ページ目に、モナドの使いどころの説明がありました。

 

f:id:hamamuratakuo:20190908160144j:plain

 

ダイクストラの構造化プログラミングで、

  1. 順次
  2. 反復
  3. 分岐

という3つの基本的な制御構造があります。

 

これに対応する関数型言語の道具が、

  1. 順次 ≒ Applicative
  2. 反復 ≒ Functor
  3. 分岐 ≒ Monad

という形で対応付けられていました。

 

Haskellのコード例

動画だと34分40秒あたり、スライド121ページ目

 

f:id:hamamuratakuo:20190908170018j:plain

-- Functor (自己)関手
class Functor f where
    fmap :: (a -> b) -> f a -> f b

-- Applicative アプリカティブ関手
class Functor f => Applicative f where
    pure :: a -> f a
    (<*>) :: f (a -> b) -> f a -> f b

-- Monad モナド
class Applicative m => Monad m where
    (>>=) :: m a -> (a -> m b) -> m b
    return :: a -> m a
    return = pure

 

モナド圏論の概観を把握する上で、上記の視点を持って、学んでみたいと思います。