モナドがいっぱい!
 すごい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 )
                                                       ※日本語訳もあります

モナドがいっぱい!

Editor's Notes

  • #2 &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
  • #3 &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
  • #4 \n
  • #5 \n
  • #6 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
  • #7 &amp;#x5897;&amp;#x3048;&amp;#x3066;&amp;#x307E;&amp;#x3059;&amp;#x3002;\n
  • #8 &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
  • #9 \n
  • #10 \n
  • #11 &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
  • #12 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
  • #13 \n
  • #14 \n
  • #15 Functor&amp;#x306E;&amp;#x5B9A;&amp;#x7FA9;&amp;#x306F;&amp;#x3053;&amp;#x3093;&amp;#x306A;&amp;#x3067;&amp;#x3057;&amp;#x305F;&amp;#x3002;\n
  • #16 Applicative&amp;#x306F;&amp;#x3053;&amp;#x3093;&amp;#x306A;\n
  • #17 &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
  • #18 &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
  • #19 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
  • #20 &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
  • #21 &amp;#xFF08;&amp;#x30D4;&amp;#x30B3;&amp;#x30FC;&amp;#x30F3;&amp;#xFF09;\n
  • #22 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
  • #23 &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
  • #24 \n
  • #25 &amp;#x30B3;&amp;#x30B3;&amp;#x304C;&amp;#x9055;&amp;#x3063;&amp;#x3066;&amp;#x3001;\n
  • #26 \n
  • #27 &amp;#x30B3;&amp;#x30B3;&amp;#x304C;&amp;#x304A;&amp;#x3093;&amp;#x306A;&amp;#x3058;&amp;#x3067;&amp;#x3059;&amp;#x3002;\n
  • #28 &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
  • #29 \n
  • #30 &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
  • #31 \n
  • #32 &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
  • #33 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
  • #34 \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 &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
  • #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
  • #81 \n