SlideShare ist ein Scribd-Unternehmen logo
1 von 80
モナドがいっぱい!
 すごいHaskell楽しく学ぼう!13章
自己紹介


佐藤建太         @brain_apple

東京大学 農学部 (生物系)

バイトや趣味としてプログラミングしてます

perl Javascript OCamlもやりたい
モナド、こわい?
モナド、難しい?
Monad tutorials timeline




http://www.haskell.org/haskellwiki/Monad_tutorials_timeline
Monad tutorials timeline


                                                     リア ル
                         ュート
       ナ              ドチ
  える モ
増

  http://www.haskell.org/haskellwiki/Monad_tutorials_timeline
やはりひとつの難関.....
しかし、12章までの知識で
モナド理解の障壁は
低くなっているはず
Haskellの型クラス関係図
http://www.haskell.org/haskellwiki/Typeclassopedia
今日触れるところ




Haskellの型クラス関係図
http://www.haskell.org/haskellwiki/Typeclassopedia
Functor, Applicative, Monad, MonadPlusは、
ApplicativeがFunctorを継承し、
MonadがApplicativeを継承し、
MonadPlusがMonadを継承している
という関係にある。
Monad
その前に、
Functor復習



class Functor f where
    (<$>) :: (a -> b) -> f a -> f b
Applicative復習




class (Functor f) => Applicative f where
    pure :: a -> f a
    (<*>) :: f (a -> b) -> a -> b
そしてMonad



class Monad m where
    return :: a -> m a
    (>>=) :: m a -> (a -> m b) -> m b
そしてMonad



class Monad m where
    return :: a -> m a
    (>>=) :: m a -> (a -> m b) -> m b


     >>= は「バインド」と呼びます
ApplicativeとMonadを見比べてみると、


  -- Applicative
  pure :: a -> f a

  -- Monad
  return :: a -> m a

     Applicative の pure と
 Monad の return は同じような型で、
Functor, Applicative, Monadを見比べてみると、

    -- Functor
    (<$>) :: (a -> b) -> f a -> f b

    -- Applicative
    (<*>) :: f (a -> b) -> f a -> f b

    -- Monad
    (>>=) :: m a -> (a -> m b) -> m b



  ムムッ、よくわからないが似たカンジがする。
\  __  /
_ (M)_  ピコーン
    |ミ|
/ `´  \
  ( ゚∀゚)
 ノヽノ |
   < <
<$>と<*>の引数の型の順序を入れ替えてみると、




-- Functor                          -- Functor'
(<$>) :: (a -> b) -> f a -> f b     (<$>) :: f a ->   (a ->   b) -> f b

-- Applicative                      -- Applicative'
(<*>) :: f (a -> b) -> f a -> f b   (<*>) :: f a -> f (a ->   b) -> f b

-- Monad                            -- Monad
(>>=) :: m a -> (a -> m b) -> m b   (>>=) :: m a ->   (a -> m b) -> m b
第2引数の違いだけ!
-- Functor'
(<$>) :: f a ->   (a ->   b) -> f b

-- Applicative'
(<*>) :: f a -> f (a ->   b) -> f b

-- Monad
(>>=) :: m a ->   (a -> m b) -> m b
第2引数の違いだけ!
-- Functor'
(<$>) :: f a ->   (a ->   b) -> f b

-- Applicative'
(<*>) :: f a -> f (a ->   b) -> f b

-- Monad
(>>=) :: m a ->   (a -> m b) -> m b
第2引数の違いだけ!             違う
-- Functor'
(<$>) :: f a ->   (a ->   b) -> f b

-- Applicative'
(<*>) :: f a -> f (a ->   b) -> f b

-- Monad
(>>=) :: m a ->   (a -> m b) -> m b
第2引数の違いだけ!             違う
-- Functor'
(<$>) :: f a ->   (a ->   b) -> f b

-- Applicative'
(<*>) :: f a -> f (a ->   b) -> f b

-- Monad
(>>=) :: m a ->   (a -> m b) -> m b
第2引数の違いだけ!              違う
-- Functor'
(<$>) :: f a ->   (a ->    b) -> f b

-- Applicative'
(<*>) :: f a -> f (a ->    b) -> f b

-- Monad
(>>=) :: m a ->   (a -> m b) -> m b


同じ                        同じ
Functor復習

-- Functor'
(<$>) :: f a ->   (a ->   b) -> f b




 シンプルな関数で、文脈(コンテナ)
 である f とは関係がない。
Applicative復習

-- Applicative'
(<*>) :: f a -> f (a ->   b) -> f b



    文脈(コンテナ)の中の値を、
    その中で写すだけ。
そしてMonad

-- Monad
(>>=) :: m a ->   (a -> m b) -> m b



  文脈(コンテナ)の中の値を取って、
  同じ文脈だが      別の値      を返す関数
ふむふむ、
Maybeモナドで見てみよう。
instance Monad Maybe where
    -- :: x -> Maybe a
    return = Just

    -- :: Maybe a -> (a -> Maybe b) -> Maybe b
    Nothing >>= f = Nothing
    Just x >>= f = f x
-- return :: x -> Maybe a

return = Just



returnは受け取った値をJustで
Maybeの文脈につつむだけ。
-- :: m a -> (a -> m b) -> m b
Nothing >>= f = Nothing
Just x >>= f = f x

 第二引数の関数 f は、生の値(文脈無しの値) x を
 取って、文脈付きの   別の値   を返す。



    関数f は、受け取った値 x に依っては
    Nothingを返すこともできる!
-- :: m a -> (a -> m b) -> m b
Nothing >>= f = Nothing
Just x >>= f = f x

 第二引数の関数 f は、生の値(文脈無しの値) x を
 取って、文脈付きの   別の値   を返す。



    関数f は、受け取った値 x に依っては
    Nothingを返すこともできる!
具体例     綱渡り問題


養魚場ではたらくピエールは休暇を使って綱渡りをします。(?)

バランス棒を持って綱渡りします。

でも、たまにバランス棒の両端に鳥が止まります。

左右端の止まった鳥の数の差が4羽以上になるとバランスを崩
して綱渡り失敗です。
仕様



鳥の数はBirds型、バランス棒はPole型

landLeft n でn羽の鳥が左端に止まる。(右端も同様)

落ちてない・落ちたの状態をそれぞれJustとNothingで表す

モナドのバインド(>>=)で計算をつなげる
やりましょう
やりました

type Birds = Int
type Pole = (Birds, Birds)

landLeft :: Birds -> Pole -> Maybe Pole
landLeft n (left, right)
    | abs ((left + n) - right) < 4 = Just (left + n, right)
    | otherwise              = Nothing

landRight :: Birds -> Pole -> Maybe Pole
landRight n (left, right)
    | abs (left - (right + n)) < 4 = Just (left, right + n)
    | otherwise              = Nothing
やりました 成功か失敗か
 止まる鳥の数 棒の状態
type Birds = Int
type Pole = (Birds, Birds)

landLeft :: Birds -> Pole -> Maybe Pole
landLeft n (left, right)
    | abs ((left + n) - right) < 4 = Just (left + n, right)
    | otherwise              = Nothing

landRight :: Birds -> Pole -> Maybe Pole
landRight n (left, right)
    | abs (left - (right + n)) < 4 = Just (left, right + n)
    | otherwise              = Nothing
こんな感じです
> landLeft 2 (0, 0)
Just (2, 0) -- 大丈夫(・ω<)

> landLeft 6 (2, 4)
Nothing     -- 失敗(´;ω;`)
そして、
> :t landLeft 3
landLeft 3 :: Pole -> Maybe Pole




      ここの型が合う
> :t (>>=)
(>>=) :: m a -> (a -> m b) -> m b
なので、
> :t (>>= landLeft 3)
(>>= landLeft 3) :: Maybe Pole -> Maybe Pole
MaybeからMaybeへの関数を実現。
それも、計算の失敗検出機能付き。

> :t (>>= landLeft 3)
(>>= landLeft 3) :: Maybe Pole -> Maybe Pole
全く新しい計算が、
あなたの思いのまま。
そう、Monad ならね。
> Just (0, 0) >>= landLeft 3
Just (3, 0)
これは成功し、


> Just (0, 0) >>= landLeft 4
Nothing
これは失敗です。
> Just (0, 0) >>= landLeft 3
Just (3, 0)
これは成功し、


> Just (0, 0) >>= landLeft 4
Nothing
これは失敗です。
> Just (0, 0) >>= landLeft 3
Just (3, 0)
これは成功し、


> Just (0, 0) >>= landLeft 4
Nothing
これは失敗です。
> Just (0, 0) >>= landLeft 1 >>= landRight 3
Just (1, 3)

> Just (0, 0) >>= landLeft 9 >>= landRight 9
Nothing



       (>>=)で計算をつなげたり、
       途中の失敗を最終結果として
       得ることもできます
いつでも失敗するbananaを定義すると、
途中にバナナがあればいつでも失敗します


banana :: Pole -> Maybe Pole
banana = const Nothing

実行例
> Just (0, 0) >>= banana >>= landLeft 1
Nothing
ちょいまとめ
コンテキストの中にある値を見て
成功(Just)か失敗(Nothing)かを
返すことは、Functor や
Applicative ではできない
Maybeモナドでは、
コンテキストの中の値を受けて
Just を返すか Nothing を返すか
第2引数の関数が決めることができる


(>>=) :: m a ->   (a -> m b) -> m b
リストモナド
instance Monad [] where
    return x = [x]
    xs >>= f = concat (map f xs)
渡されたリストの要素
全てに map を通して f を適用する

instance Monad [] where
    return x = [x]
    xs >>= f = concat (map f xs)
渡されたリストの要素
全てに map を通して f を適用する

instance Monad [] where
    return x = [x]
    xs >>= f = concat (map f xs)



   そして concat でまとめ上げる
[3,4,5] >>= x -> [x, -x]
            3 -> [3, -3]
 mapで
 分岐して       4 -> [4, -4]
            5 -> [5, -5]

         concatでまとめ上げる

  計算結果   [3,-3,4,-4,5,-5]
リストモナドを使えば
(>>=)でつなげると、
複数の候補がある計算を
自然に書ける
Σd(゚ ゚d)イカス!
MonadPlus
class Monad m => MonadPlus where
    mzero :: m a
    mplus :: m a -> m a -> m a


Monadに適用できる関数を追加 = 機能の追加

mzeroが「失敗」に当たり、

mplusが「選択」に当たる。
「失敗」の mzero


             > mzero :: Maybe ()
 maybeでは
             Nothing
Nothingになる


 リストでは       > mzero :: [()]
 空のリスト       []
「選択」の mplus (Maybe)
           > Just 1 `mplus` Just 2
  左が優先
           Just 1

右は失敗でも     > Just 1 `mplus` Nothing
  OK       Nothing

        > Nothing `mplus` Just 1
左がダメなら右
        Just 1

両方ダメなら     > Nothing `mplus` Nothing
  失敗       Nothing
「選択」の mplus (リスト)
        > [1,2] `mplus` [3,4]
        [1,2,3,4]

すべての    > [1,2] `mplus` []
        [1,2]
選択肢を
保持する。   > [] `mplus` [3,4]
        [3,4]

        > [] `mplus` []
        []
                    ※ただリストをつなげているだけ
guard
             失敗する値を定義する

guard :: (MonadPlus m) => Bool -> m ()
guard True = return ()
guard False = mzero


  3の倍数、もしくは3がつく数字だけを返す

nabe :: Int -> [Int]
nabe = x ->
    guard ('3' `elem` show x || x `mod` 3 == 0)
    >> return x
ちゃんと動いてますね


> [1..100] >>= nabe
[3,6,9,12,13,15,18,21,23,24,27,30,31,32,
33,34,35,36,37,38,39,42,43,45,48,51,53,
54,57,60,63,66,69,72,73,75,78,81,83,84,
87,90,93,96,99]



              ※なんで関数名が nabe なのか分からなかった人は
                    「世界のナベアツ」で調べてみよう!
ナイトの可能な動きも簡単に表せます

type Pos = (Int, Int)

moveKnight :: Pos -> [Pos]
moveKnight (x, y) = do
    (x', y') <- [(x+1,y+2),(x+2,y+1),(x-1,y-2),(x-2,y-1),
                 (x+1,y-2),(x+2,y-1),(x-1,y+2),(x-2,y+1)]
    guard (x' `elem` [1..8] && y' `elem` [1..8])
    return (x', y')




                 盤上にない動きを排除
ちなみに、


guard は Control.Monad モジュールで
定義されているので、使うときはここから
インポートしましょう。
実はAlternativeというのがあってだな...


Applicative版の MonadPlus


Control.Applicative モジュールで定義されている


Applicative版なので MonadPlus より適用範囲は広い(はず)


でも Applicative なので guard は使えない


Parsec などパーサーコンビネータを書くときは便利
Monad則もあるんだよ

-- 左恒等性
return a >>= k   = k a

-- 右恒等性
m >>= return     = m

-- 結合性
(m >>= k) >>= h = m >>= (x -> k x >>= h)
Monad則もあるんだよ
   return が id っぽく振る舞うよ

-- 左恒等性
return x >>= k   = k x

-- 右恒等性
m >>= return     = m

-- 結合性
(m >>= k) >>= h = m >>= (x -> k x >>= h)
Monad則もあるんだよ
   return が id っぽく振る舞うよ

-- 左恒等性
return x >>= k   = k x

-- 右恒等性
m >>= return     = m

-- 結合性
(m >>= k) >>= h = m >>= (x -> k x >>= h)

    結合の順序は関係ないよ
まとめ



Functor も Applicative も Monad も型が似てる

Monadなら文脈(コンテナ)の中の値に直接アクセスして、  
処理をコントーロールできる

処理のコントロールの仕方は、その文脈に依って様々ある
紹介してないモナドたちも
たくさんあるので、
つづく14章やいろいろなモナドを
覗いてみよう!
ご清澄ありがとうございました。
参考




「すごいHaskell楽しく学ぼう!」(オーム社)

Typeclassopedia   (http://www.haskell.org/haskellwiki/Typeclassopedia )
                                                       ※日本語訳もあります

Weitere ähnliche Inhalte

Was ist angesagt?

C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるHideyuki Tanaka
 
C++11概要 ライブラリ編
C++11概要 ライブラリ編C++11概要 ライブラリ編
C++11概要 ライブラリ編egtra
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14Ryo Suzuki
 
Van laarhoven lens
Van laarhoven lensVan laarhoven lens
Van laarhoven lensNaoki Aoyama
 
20141128 iOSチーム勉強会 My Sweet Swift
20141128 iOSチーム勉強会 My Sweet Swift20141128 iOSチーム勉強会 My Sweet Swift
20141128 iOSチーム勉強会 My Sweet Swiftnecocen
 
Feature Selection with R / in JP
Feature Selection with R / in JPFeature Selection with R / in JP
Feature Selection with R / in JPSercan Ahi
 
Rで学ぶデータマイニングI 第8章〜第13章
Rで学ぶデータマイニングI 第8章〜第13章Rで学ぶデータマイニングI 第8章〜第13章
Rで学ぶデータマイニングI 第8章〜第13章Prunus 1350
 
すごいHaskell楽しく学ぼう 第6章
すごいHaskell楽しく学ぼう 第6章すごいHaskell楽しく学ぼう 第6章
すごいHaskell楽しく学ぼう 第6章aomori ringo
 
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜勝成 鈴江
 
Pythonで始めるDropboxAPI
Pythonで始めるDropboxAPIPythonで始めるDropboxAPI
Pythonで始めるDropboxAPIDaisuke Igarashi
 
Java8 Lambda chapter5
Java8 Lambda chapter5Java8 Lambda chapter5
Java8 Lambda chapter5Takinami Kei
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門Hideyuki Tanaka
 
Effective java 勉強会
Effective java 勉強会Effective java 勉強会
Effective java 勉強会Takinami Kei
 

Was ist angesagt? (20)

C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
 
MP in Scala
MP in ScalaMP in Scala
MP in Scala
 
MP in Haskell
MP in HaskellMP in Haskell
MP in Haskell
 
C++11概要 ライブラリ編
C++11概要 ライブラリ編C++11概要 ライブラリ編
C++11概要 ライブラリ編
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
 
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
 
Map
MapMap
Map
 
Van laarhoven lens
Van laarhoven lensVan laarhoven lens
Van laarhoven lens
 
 
  
 
 
Applicative functor
Applicative functorApplicative functor
Applicative functor
 
20141128 iOSチーム勉強会 My Sweet Swift
20141128 iOSチーム勉強会 My Sweet Swift20141128 iOSチーム勉強会 My Sweet Swift
20141128 iOSチーム勉強会 My Sweet Swift
 
Feature Selection with R / in JP
Feature Selection with R / in JPFeature Selection with R / in JP
Feature Selection with R / in JP
 
Rで学ぶデータマイニングI 第8章〜第13章
Rで学ぶデータマイニングI 第8章〜第13章Rで学ぶデータマイニングI 第8章〜第13章
Rで学ぶデータマイニングI 第8章〜第13章
 
すごいHaskell楽しく学ぼう 第6章
すごいHaskell楽しく学ぼう 第6章すごいHaskell楽しく学ぼう 第6章
すごいHaskell楽しく学ぼう 第6章
 
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
 
Pythonで始めるDropboxAPI
Pythonで始めるDropboxAPIPythonで始めるDropboxAPI
Pythonで始めるDropboxAPI
 
Java8 Lambda chapter5
Java8 Lambda chapter5Java8 Lambda chapter5
Java8 Lambda chapter5
 
Emcjp item21
Emcjp item21Emcjp item21
Emcjp item21
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
 
Effective java 勉強会
Effective java 勉強会Effective java 勉強会
Effective java 勉強会
 

Andere mochten auch

実践! D3.jsで可視化入門
実践! D3.jsで可視化入門実践! D3.jsで可視化入門
実践! D3.jsで可視化入門Kenta Sato
 
Julia - Easier, Better, Faster, Stronger
Julia - Easier, Better, Faster, StrongerJulia - Easier, Better, Faster, Stronger
Julia - Easier, Better, Faster, StrongerKenta Sato
 
ゆるふわなHaskell話
ゆるふわなHaskell話ゆるふわなHaskell話
ゆるふわなHaskell話Kousuke Ruichi
 
Material
MaterialMaterial
Material_TUNE_
 
すごいHaskellたのしくHeroku!
すごいHaskellたのしくHeroku!すごいHaskellたのしくHeroku!
すごいHaskellたのしくHeroku!Haruka Nakajima
 
あまり知られていない静岡の言語戦争の歴史
あまり知られていない静岡の言語戦争の歴史あまり知られていない静岡の言語戦争の歴史
あまり知られていない静岡の言語戦争の歴史Kazufumi Ohkawa
 
Vim scriptとJavaとHaskell
Vim scriptとJavaとHaskellVim scriptとJavaとHaskell
Vim scriptとJavaとHaskellaiya000
 
モナモナ言うモナド入門.tar.gz
モナモナ言うモナド入門.tar.gzモナモナ言うモナド入門.tar.gz
モナモナ言うモナド入門.tar.gzMasahiro Honma
 
20160902 scalaの魅力を話してみる
20160902 scalaの魅力を話してみる20160902 scalaの魅力を話してみる
20160902 scalaの魅力を話してみるYoshitaka Fujii
 
Monadなんてどうってことなかった話 - Monadなんてただの型クラス!
Monadなんてどうってことなかった話 - Monadなんてただの型クラス!Monadなんてどうってことなかった話 - Monadなんてただの型クラス!
Monadなんてどうってことなかった話 - Monadなんてただの型クラス!悠滋 山本
 
Juliaのパッケージをつくろう!
Juliaのパッケージをつくろう!Juliaのパッケージをつくろう!
Juliaのパッケージをつくろう!Kenta Sato
 
すごいVimでhaskellを書こう@なごやまつり
すごいVimでhaskellを書こう@なごやまつりすごいVimでhaskellを書こう@なごやまつり
すごいVimでhaskellを書こう@なごやまつりcohama
 
YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情
YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情
YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情Junichi Ishida
 
PHPとJavaScriptの噺
PHPとJavaScriptの噺PHPとJavaScriptの噺
PHPとJavaScriptの噺Shogo Kawahara
 
数学プログラムを Haskell で書くべき 6 の理由
数学プログラムを Haskell で書くべき 6 の理由数学プログラムを Haskell で書くべき 6 の理由
数学プログラムを Haskell で書くべき 6 の理由Hiromi Ishii
 
バージョン管理のワークフロー
バージョン管理のワークフローバージョン管理のワークフロー
バージョン管理のワークフローadd20
 
Gitのよく使うコマンド
Gitのよく使うコマンドGitのよく使うコマンド
Gitのよく使うコマンドYUKI Kaoru
 

Andere mochten auch (20)

Xen Memory Management
Xen Memory ManagementXen Memory Management
Xen Memory Management
 
究極のPHP本完成
究極のPHP本完成究極のPHP本完成
究極のPHP本完成
 
実践! D3.jsで可視化入門
実践! D3.jsで可視化入門実践! D3.jsで可視化入門
実践! D3.jsで可視化入門
 
Julia - Easier, Better, Faster, Stronger
Julia - Easier, Better, Faster, StrongerJulia - Easier, Better, Faster, Stronger
Julia - Easier, Better, Faster, Stronger
 
ゆるふわなHaskell話
ゆるふわなHaskell話ゆるふわなHaskell話
ゆるふわなHaskell話
 
Material
MaterialMaterial
Material
 
すごいHaskellたのしくHeroku!
すごいHaskellたのしくHeroku!すごいHaskellたのしくHeroku!
すごいHaskellたのしくHeroku!
 
あまり知られていない静岡の言語戦争の歴史
あまり知られていない静岡の言語戦争の歴史あまり知られていない静岡の言語戦争の歴史
あまり知られていない静岡の言語戦争の歴史
 
Vim scriptとJavaとHaskell
Vim scriptとJavaとHaskellVim scriptとJavaとHaskell
Vim scriptとJavaとHaskell
 
モナモナ言うモナド入門.tar.gz
モナモナ言うモナド入門.tar.gzモナモナ言うモナド入門.tar.gz
モナモナ言うモナド入門.tar.gz
 
20160902 scalaの魅力を話してみる
20160902 scalaの魅力を話してみる20160902 scalaの魅力を話してみる
20160902 scalaの魅力を話してみる
 
Monadなんてどうってことなかった話 - Monadなんてただの型クラス!
Monadなんてどうってことなかった話 - Monadなんてただの型クラス!Monadなんてどうってことなかった話 - Monadなんてただの型クラス!
Monadなんてどうってことなかった話 - Monadなんてただの型クラス!
 
Juliaのパッケージをつくろう!
Juliaのパッケージをつくろう!Juliaのパッケージをつくろう!
Juliaのパッケージをつくろう!
 
すごいVimでhaskellを書こう@なごやまつり
すごいVimでhaskellを書こう@なごやまつりすごいVimでhaskellを書こう@なごやまつり
すごいVimでhaskellを書こう@なごやまつり
 
PHP版レガシーコード改善に役立つ新パターン #wewlc_jp
PHP版レガシーコード改善に役立つ新パターン #wewlc_jp PHP版レガシーコード改善に役立つ新パターン #wewlc_jp
PHP版レガシーコード改善に役立つ新パターン #wewlc_jp
 
YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情
YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情
YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情
 
PHPとJavaScriptの噺
PHPとJavaScriptの噺PHPとJavaScriptの噺
PHPとJavaScriptの噺
 
数学プログラムを Haskell で書くべき 6 の理由
数学プログラムを Haskell で書くべき 6 の理由数学プログラムを Haskell で書くべき 6 の理由
数学プログラムを Haskell で書くべき 6 の理由
 
バージョン管理のワークフロー
バージョン管理のワークフローバージョン管理のワークフロー
バージョン管理のワークフロー
 
Gitのよく使うコマンド
Gitのよく使うコマンドGitのよく使うコマンド
Gitのよく使うコマンド
 

Ähnlich wie モナドがいっぱい!

モナドハンズオン前座
モナドハンズオン前座モナドハンズオン前座
モナドハンズオン前座bleis tift
 
すごいHaskell読書会#10
すごいHaskell読書会#10すごいHaskell読書会#10
すごいHaskell読書会#10Shin Ise
 
Haskell勉強会 14.1〜14.3 の説明資料
Haskell勉強会 14.1〜14.3 の説明資料Haskell勉強会 14.1〜14.3 の説明資料
Haskell勉強会 14.1〜14.3 の説明資料Etsuji Nakai
 
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~Nobuhisa Koizumi
 
Extensible Eff Applicative
Extensible Eff ApplicativeExtensible Eff Applicative
Extensible Eff ApplicativeSanshiro Yoshida
 
すごいHaskell読書会 in 大阪 2週目 #5 第5章:高階関数 (2)
すごいHaskell読書会 in 大阪 2週目 #5 第5章:高階関数 (2)すごいHaskell読書会 in 大阪 2週目 #5 第5章:高階関数 (2)
すごいHaskell読書会 in 大阪 2週目 #5 第5章:高階関数 (2)Yoichi Nakayama
 
これから Haskell を書くにあたって
これから Haskell を書くにあたってこれから Haskell を書くにあたって
これから Haskell を書くにあたってTsuyoshi Matsudate
 
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coqTpp2012 mwpl on_coq
Tpp2012 mwpl on_coqSUDA Keishi
 
2013.12.26 prml勉強会 線形回帰モデル3.2~3.4
2013.12.26 prml勉強会 線形回帰モデル3.2~3.42013.12.26 prml勉強会 線形回帰モデル3.2~3.4
2013.12.26 prml勉強会 線形回帰モデル3.2~3.4Takeshi Sakaki
 
Freer Monads, More Extensible Effects
Freer Monads, More Extensible EffectsFreer Monads, More Extensible Effects
Freer Monads, More Extensible EffectsHiromi Ishii
 
モナドをつくろう
モナドをつくろうモナドをつくろう
モナドをつくろうdico_leque
 
並行プログラミングと継続モナド
並行プログラミングと継続モナド並行プログラミングと継続モナド
並行プログラミングと継続モナドKousuke Ruichi
 
wakuwaku Scala ~Scala入門勉強会~ 資料
wakuwaku Scala ~Scala入門勉強会~ 資料wakuwaku Scala ~Scala入門勉強会~ 資料
wakuwaku Scala ~Scala入門勉強会~ 資料Mizuki Yamanaka
 
Java SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイルJava SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイルなおき きしだ
 
Adding simpl GVN path into GHC
Adding simpl GVN path into GHCAdding simpl GVN path into GHC
Adding simpl GVN path into GHCKei Hibino
 
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミングOuka Yuka
 
これから Haskell を書くにあたって
これから Haskell を書くにあたってこれから Haskell を書くにあたって
これから Haskell を書くにあたってTsuyoshi Matsudate
 
Implicit Explicit Scala
Implicit Explicit ScalaImplicit Explicit Scala
Implicit Explicit ScalaKota Mizushima
 

Ähnlich wie モナドがいっぱい! (19)

モナドハンズオン前座
モナドハンズオン前座モナドハンズオン前座
モナドハンズオン前座
 
すごいHaskell読書会#10
すごいHaskell読書会#10すごいHaskell読書会#10
すごいHaskell読書会#10
 
Church Numerals
Church NumeralsChurch Numerals
Church Numerals
 
Haskell勉強会 14.1〜14.3 の説明資料
Haskell勉強会 14.1〜14.3 の説明資料Haskell勉強会 14.1〜14.3 の説明資料
Haskell勉強会 14.1〜14.3 の説明資料
 
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~
 
Extensible Eff Applicative
Extensible Eff ApplicativeExtensible Eff Applicative
Extensible Eff Applicative
 
すごいHaskell読書会 in 大阪 2週目 #5 第5章:高階関数 (2)
すごいHaskell読書会 in 大阪 2週目 #5 第5章:高階関数 (2)すごいHaskell読書会 in 大阪 2週目 #5 第5章:高階関数 (2)
すごいHaskell読書会 in 大阪 2週目 #5 第5章:高階関数 (2)
 
これから Haskell を書くにあたって
これから Haskell を書くにあたってこれから Haskell を書くにあたって
これから Haskell を書くにあたって
 
Tpp2012 mwpl on_coq
Tpp2012 mwpl on_coqTpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
 
2013.12.26 prml勉強会 線形回帰モデル3.2~3.4
2013.12.26 prml勉強会 線形回帰モデル3.2~3.42013.12.26 prml勉強会 線形回帰モデル3.2~3.4
2013.12.26 prml勉強会 線形回帰モデル3.2~3.4
 
Freer Monads, More Extensible Effects
Freer Monads, More Extensible EffectsFreer Monads, More Extensible Effects
Freer Monads, More Extensible Effects
 
モナドをつくろう
モナドをつくろうモナドをつくろう
モナドをつくろう
 
並行プログラミングと継続モナド
並行プログラミングと継続モナド並行プログラミングと継続モナド
並行プログラミングと継続モナド
 
wakuwaku Scala ~Scala入門勉強会~ 資料
wakuwaku Scala ~Scala入門勉強会~ 資料wakuwaku Scala ~Scala入門勉強会~ 資料
wakuwaku Scala ~Scala入門勉強会~ 資料
 
Java SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイルJava SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイル
 
Adding simpl GVN path into GHC
Adding simpl GVN path into GHCAdding simpl GVN path into GHC
Adding simpl GVN path into GHC
 
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
 
これから Haskell を書くにあたって
これから Haskell を書くにあたってこれから Haskell を書くにあたって
これから Haskell を書くにあたって
 
Implicit Explicit Scala
Implicit Explicit ScalaImplicit Explicit Scala
Implicit Explicit Scala
 

モナドがいっぱい!

Hinweis der Redaktion

  1. &amp;#x305D;&amp;#x308C;&amp;#x3067;&amp;#x306F;&amp;#x3001;&amp;#xFF11;&amp;#xFF13;&amp;#x7AE0;&amp;#x306E;&amp;#x30E2;&amp;#x30CA;&amp;#x30C9;&amp;#x304C;&amp;#x3044;&amp;#x3063;&amp;#x3071;&amp;#x3044;&amp;#x3092;&amp;#x767A;&amp;#x8868;&amp;#x3055;&amp;#x305B;&amp;#x3066;&amp;#x3044;&amp;#x305F;&amp;#x3060;&amp;#x304D;&amp;#x307E;&amp;#x3059;&amp;#x3002;\n&amp;#x3088;&amp;#x308D;&amp;#x3057;&amp;#x304F;&amp;#x304A;&amp;#x9858;&amp;#x3044;&amp;#x3057;&amp;#x307E;&amp;#x3059;&amp;#x3002;\n
  2. &amp;#x307E;&amp;#x305A;&amp;#x81EA;&amp;#x5DF1;&amp;#x7D39;&amp;#x4ECB;&amp;#x3067;&amp;#x3059;&amp;#x3002;~~\n&amp;#x30E2;&amp;#x30CA;&amp;#x30C9;&amp;#x3063;&amp;#x3066;&amp;#x3069;&amp;#x3093;&amp;#x306A;&amp;#x30A4;&amp;#x30E1;&amp;#x30FC;&amp;#x30B8;&amp;#x3067;&amp;#x3059;&amp;#x304B;?\n
  3. \n
  4. \n
  5. haskell.org&amp;#x304C;&amp;#x8A08;&amp;#x6E2C;&amp;#x3057;&amp;#x3066;&amp;#x3044;&amp;#x308B;&amp;#x30E2;&amp;#x30CA;&amp;#x30C9;&amp;#x30C1;&amp;#x30E5;&amp;#x30FC;&amp;#x30C8;&amp;#x30EA;&amp;#x30A2;&amp;#x30EB;&amp;#x306E;&amp;#x6570;&amp;#x3067;&amp;#x3059;&amp;#x3002;\n
  6. &amp;#x5897;&amp;#x3048;&amp;#x3066;&amp;#x307E;&amp;#x3059;&amp;#x3002;\n
  7. &amp;#x30E2;&amp;#x30CA;&amp;#x30C9;&amp;#x3092;&amp;#x609F;&amp;#x308B; =&gt; &amp;#x30E2;&amp;#x30CA;&amp;#x30C9;&amp;#x30C1;&amp;#x30E5;&amp;#x30FC;&amp;#x30C8;&amp;#x30EA;&amp;#x30A2;&amp;#x30EB;&amp;#x3092;&amp;#x66F8;&amp;#x304F;&amp;#x3068;&amp;#x3044;&amp;#x3046;&amp;#x6D41;&amp;#x308C;&amp;#x304C;&amp;#x3042;&amp;#x308B;&amp;#x3088;&amp;#x3046;&amp;#x3067;&amp;#x3059;&amp;#x306D;&amp;#x3002;\n
  8. \n
  9. \n
  10. &amp;#x4ECA;&amp;#x65E5;&amp;#x89E6;&amp;#x308C;&amp;#x308B;&amp;#x578B;&amp;#x30AF;&amp;#x30E9;&amp;#x30B9;&amp;#x306F;Functor, Applicative, Monado&amp;#x305D;&amp;#x3057;&amp;#x3066;MonadPlus&amp;#x3067;&amp;#x3059;&amp;#x3002;\n
  11. Functor, Applicative, Monad, MonadPlus&amp;#x306E;&amp;#x95A2;&amp;#x4FC2;&amp;#x306F;&amp;#x968E;&amp;#x5C64;&amp;#x69CB;&amp;#x9020;&amp;#x306B;&amp;#x306A;&amp;#x3063;&amp;#x3066;&amp;#x3044;&amp;#x3066;&amp;#x3001;\nApplicative&amp;#x304C;Functor&amp;#x3092;&amp;#x7D99;&amp;#x627F;&amp;#x3001;Monad&amp;#x304C;Applicative&amp;#x3092;&amp;#x7D99;&amp;#x627F;&amp;#x3001;&amp;#x305D;&amp;#x3057;&amp;#x3066;MonadPlus&amp;#x304C;Monad&amp;#x3092;&amp;#x7D99;&amp;#x627F;&amp;#x3057;&amp;#x3066;&amp;#x3044;&amp;#x307E;&amp;#x3059;&amp;#x3002;\n
  12. \n
  13. \n
  14. Functor&amp;#x306E;&amp;#x5B9A;&amp;#x7FA9;&amp;#x306F;&amp;#x3053;&amp;#x3093;&amp;#x306A;&amp;#x3067;&amp;#x3057;&amp;#x305F;&amp;#x3002;\n
  15. Applicative&amp;#x306F;&amp;#x3053;&amp;#x3093;&amp;#x306A;\n
  16. &amp;#x305D;&amp;#x3057;&amp;#x3066;&amp;#x771F;&amp;#x6253;&amp;#x30E2;&amp;#x30CA;&amp;#x30C9;&amp;#x306F;&amp;#x3053;&amp;#x3093;&amp;#x306A;&amp;#x611F;&amp;#x3058;&amp;#x3067;&amp;#x3059;&amp;#x3002;\n
  17. &gt;&gt;=&amp;#x306F;&amp;#x30D0;&amp;#x30A4;&amp;#x30F3;&amp;#x30C9;&amp;#x3068;&amp;#x547C;&amp;#x3070;&amp;#x308C;&amp;#x3066;&amp;#x3044;&amp;#x307E;&amp;#x3059;&amp;#x3002;\n
  18. Applicative&amp;#x3067;&amp;#x51FA;&amp;#x3066;&amp;#x304D;&amp;#x305F;pure&amp;#x3068;Monad&amp;#x306E;return&amp;#x306F;f&amp;#x3068;m&amp;#x306E;&amp;#x9055;&amp;#x3044;&amp;#x3060;&amp;#x3051;&amp;#x3067;&amp;#x540C;&amp;#x3058;&amp;#x3082;&amp;#x306E;&amp;#x3067;&amp;#x3059;&amp;#x306D;&amp;#x3002;\n
  19. &amp;#x3053;&amp;#x306E;&amp;#x3078;&amp;#x3093;&amp;#x306E;&amp;#x5909;&amp;#x306A;&amp;#x8A18;&amp;#x53F7;&amp;#x306E;&amp;#x95A2;&amp;#x6570;&amp;#x304C;&amp;#x96E3;&amp;#x6240;&amp;#x3067;&amp;#x3059;&amp;#x304C;&amp;#x3001;&amp;#x3069;&amp;#x308C;&amp;#x3082;&amp;#x306A;&amp;#x3093;&amp;#x3068;&amp;#x306A;&amp;#x304F;&amp;#x4F3C;&amp;#x3066;&amp;#x3044;&amp;#x307E;&amp;#x3059;&amp;#x3002;\n
  20. &amp;#xFF08;&amp;#x30D4;&amp;#x30B3;&amp;#x30FC;&amp;#x30F3;&amp;#xFF09;\n
  21. Functor&amp;#x306E;fmap&amp;#x3068;Applicative&amp;#x306E;ap&amp;#x306E;&amp;#x5F15;&amp;#x6570;&amp;#x306E;&amp;#x9806;&amp;#x756A;&amp;#x3092;&amp;#x5165;&amp;#x308C;&amp;#x66FF;&amp;#x3048;&amp;#x3066;&amp;#x307F;&amp;#x307E;&amp;#x3057;&amp;#x3087;&amp;#x3046;&amp;#x3002;\n&amp;#x7B2C;&amp;#x4E00;&amp;#x5F15;&amp;#x6570;&amp;#x3092;&amp;#x4E8C;&amp;#x756A;&amp;#x76EE;&amp;#x306B;&amp;#x5DEE;&amp;#x3057;&amp;#x8FBC;&amp;#x3093;&amp;#x3067;&amp;#x3044;&amp;#x307E;&amp;#x3059;&amp;#x3002;\n
  22. &amp;#x305D;&amp;#x3046;&amp;#x3059;&amp;#x308B;&amp;#x3068;&amp;#x3053;&amp;#x3093;&amp;#x306A;&amp;#x611F;&amp;#x3058;&amp;#x3002;\nFunctor&amp;#x3082;Applicative&amp;#x3082;Monad&amp;#x3082;&amp;#x3059;&amp;#x3054;&amp;#x304F;&amp;#x4F3C;&amp;#x3066;&amp;#x307E;&amp;#x3059;&amp;#x3002;\n
  23. \n
  24. &amp;#x30B3;&amp;#x30B3;&amp;#x304C;&amp;#x9055;&amp;#x3063;&amp;#x3066;&amp;#x3001;\n
  25. \n
  26. &amp;#x30B3;&amp;#x30B3;&amp;#x304C;&amp;#x304A;&amp;#x3093;&amp;#x306A;&amp;#x3058;&amp;#x3067;&amp;#x3059;&amp;#x3002;\n
  27. &amp;#x9806;&amp;#x756A;&amp;#x3092;&amp;#x5165;&amp;#x308C;&amp;#x66FF;&amp;#x3048;&amp;#x305F;&amp;#x72B6;&amp;#x614B;&amp;#x3067;&amp;#x6539;&amp;#x3081;&amp;#x3066;&amp;#x78BA;&amp;#x8A8D;&amp;#x3057;&amp;#x3066;&amp;#x307F;&amp;#x308B;&amp;#x3068;&amp;#x3001;~~\n
  28. \n
  29. &amp;#x30E2;&amp;#x30CA;&amp;#x30C9;&amp;#x306F;&amp;#x3001;&amp;#x7B2C;&amp;#x4E00;&amp;#x5F15;&amp;#x6570;&amp;#x306B;&amp;#x3042;&amp;#x308B;&amp;#x30E2;&amp;#x30CA;&amp;#x30C9;&amp;#x5024;&amp;#x306E;&amp;#x4E2D;&amp;#x8EAB;&amp;#x306E;&amp;#x578B;&amp;#x3092;&amp;#x53D6;&amp;#x3063;&amp;#x3066;&amp;#x3001;&amp;#x6539;&amp;#x3081;&amp;#x3066;&amp;#x5225;&amp;#x306E;&amp;#x30E2;&amp;#x30CA;&amp;#x30C9;&amp;#x5024;&amp;#x3092;&amp;#x8FD4;&amp;#x3059;&amp;#x95A2;&amp;#x6570;&amp;#x304C;\n&amp;#x7B2C;&amp;#x4E8C;&amp;#x5F15;&amp;#x6570;&amp;#x306E;&amp;#x4F4D;&amp;#x7F6E;&amp;#x306B;&amp;#x6765;&amp;#x3066;&amp;#x3044;&amp;#x307E;&amp;#x3059;&amp;#x3002;\n
  30. \n
  31. &amp;#x305D;&amp;#x308C;&amp;#x3067;&amp;#x306F;&amp;#x5177;&amp;#x4F53;&amp;#x7684;&amp;#x306B;Maybe&amp;#x30E2;&amp;#x30CA;&amp;#x30C9;&amp;#x3092;&amp;#x898B;&amp;#x3066;&amp;#x307F;&amp;#x307E;&amp;#x3057;&amp;#x3087;&amp;#x3046;&amp;#x3002;\n
  32. Maybe&amp;#x30E2;&amp;#x30CA;&amp;#x30C9;&amp;#x306E;&amp;#x5B9A;&amp;#x7FA9;&amp;#x306F;&amp;#x3053;&amp;#x3093;&amp;#x306A;&amp;#x304B;&amp;#x3093;&amp;#x3058;&amp;#x3067;&amp;#x3059;&amp;#x3002;\n&amp;#x672C;&amp;#x5F53;&amp;#x306F;fail&amp;#x95A2;&amp;#x6570;&amp;#x306A;&amp;#x3069;&amp;#x3082;&amp;#x3042;&amp;#x308B;&amp;#x306E;&amp;#x3067;&amp;#x3059;&amp;#x304C;&amp;#x3001;&amp;#x3042;&amp;#x3093;&amp;#x307E;&amp;#x308A;&amp;#x91CD;&amp;#x8981;&amp;#x3058;&amp;#x3083;&amp;#x306A;&amp;#x3044;&amp;#x306E;&amp;#x3067;&amp;#x7701;&amp;#x7565;&amp;#x3067;&amp;#x3059;&amp;#x3002;\n
  33. \n
  34. &amp;#x91CD;&amp;#x8981;&amp;#x306A;&amp;#x306E;&amp;#x304C;&amp;#x95A2;&amp;#x6570;f&amp;#x306F;Nothing&amp;#x3092;&amp;#x8FD4;&amp;#x3059;&amp;#x3053;&amp;#x3068;&amp;#x3082;&amp;#x3067;&amp;#x304D;&amp;#x308B;&amp;#x3068;&amp;#x3044;&amp;#x3046;&amp;#x3053;&amp;#x3068;&amp;#x3067;&amp;#x3059;&amp;#x3002;\n
  35. &amp;#x91CD;&amp;#x8981;&amp;#x306A;&amp;#x306E;&amp;#x304C;&amp;#x95A2;&amp;#x6570;f&amp;#x306F;Nothing&amp;#x3092;&amp;#x8FD4;&amp;#x3059;&amp;#x3053;&amp;#x3068;&amp;#x3082;&amp;#x3067;&amp;#x304D;&amp;#x308B;&amp;#x3068;&amp;#x3044;&amp;#x3046;&amp;#x3053;&amp;#x3068;&amp;#x3067;&amp;#x3059;&amp;#x3002;\n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n
  71. \n
  72. \n
  73. \n
  74. \n
  75. \n
  76. \n
  77. \n
  78. \n
  79. \n
  80. \n