Date:  Wed, 27 Feb 2008 17:09:00 +0900
Subject:  【オブジェクト倶楽部: 2008-08号】
X-Mail-Count: 00230

       ┏━━━━━━━━━━━━━━━━━━━━━━━━━━■
       ┃                         ■┃
      ●┃● ● オ ブ ジ ェ ク ト 倶 楽 部   ■ ┃
       ┃                       ■  ┃
       ┗━━━━━━━━━━━━━━━━━━━━━━■━━━┛
                          No.224 2008/02/27

■ I N D E X
┃
┣【プログラミング】ゆるーいHaskell [17]
┗【コラム】東京マラソン2008参加レポート

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ■━

■
┗【プログラミング】ゆるーいHaskell [17]

西川です。今回はさらにStateモナドについてお話ししたいと思います。前回は
Stateモナドを使った簡単なサンプルSample1.hsを作成しました[*1]。

Stateモナドについて、まずはghciを起動して型を確認してみましょう。

$ ghci
> :m + Control.Monad.State
> :i State
newtype State s a = State {runState :: s -> (a, s)}
        -- Defined in Control.Monad.State.Lazy instance Monad (State s) -- Defined in Control.MonadState.Lazy
(中略)
instance MonadState s (State s)
  -- Defined in Control.Monad.State.Lazy State sが(「State」ではなくて)
Monadクラスのインスタンスであることが分かると思います。get関数とput関数
はMonadStateクラスで宣言されています。MonadStateクラスを確認してみましょ
う。

> :i MonadState
class (Monad m) => MonadState s m | m -> s where
  get :: m s
  put :: s -> m ()
        -- Defined in Control.Monad.State.Class
(省略)

最後にState s型のMonadのinstance定義、MonadStateのinstance定義を確認し
てみましょう。GHCのmtlパッケージのControl/Monad/State/Lazy.hsにStateモ
ナドの定義がされています。ソースを持っていたら確認してみましょう。

---- Control/Monad/State/Lazy.hsより ----
instance Monad (State s) where
    return a = State $ \s -> (a, s)
    m >>= k  = State $ \s -> let
        (a, s') = runState m s
        in runState (k a) s'
(中略)
instance MonadState s (State s) where
    get   = State $ \s -> (s, s)
    put s = State $ \_ -> ((), s)
---- Control/Monad/State/Lazy.hs ----

準備ができたので、Sample1.hsのadd1関数とmain関数を展開しながら説明しま
す。[*1]のリンク先のSample1.hsをあわせて参照ください。

1. do構文を(>>=)関数で置き換えます[*2]。
  add1 = get >>= put . (+) 1
2. State sのMonadのinstance定義から(>>=)関数を展開します
  (instance定義の"m"が"get"に、"k"が"put . (+)1"にあたります)。
  add1 = State $ \s -> let (a, s') = runState get s in runState (put ((+) 1 a)) s'
3. get関数の定義より"(a,s') = (s,s)"だから、変数aと変数s'が消えます。
  add1 = State $ \s -> runState (put ((+) 1 s)) s
4. put関数の定義より
  add1 = State $ \s -> ((),(+) 1 s)
5. Sample1.hsではtimesローカル関数でadd1関数をfoldl1関数を使って3回評価
   しています。これを展開してみます。
  foldl1 (>>) [add1, add1, add1]
   つまり
  (add1 >> add1) >> add1
6. Monadクラスの(>>)関数の定義により[*3]
  add1 >>= \_ -> add1 >>= \_ -> add1
7. 上記4.の展開から、
  State (\s -> ((),(+) 1 s)) >>= \_ -> add1 >>= \_ -> add1
8. State a型のMonadのインスタンス宣言より
  (State $ \s -> let (a, s') = runState (State $ \s -> ((),(+) 1 s)) s
                  in runState ((\_ -> add1) a) s') >>= \_ -> add1
9. runStateを評価して
   (State $ \s -> runState (((\_ -> add1) ()) (1 + s))) >>= \_ -> add1
  "\_ -> add1"関数に()を適用して、λ変数が消えます。
  (State $ \s -> runState add1 (1 + s)) >>= \_ -> add1
10. 上記4.の展開から
  (State $ \s -> runState (State (\s -> ((),(+) 1 s))) (1 + s)) >>= \_ -> add1
11. runStateを評価して
  (State $ \s -> ((),1 + (1 + s))) >>= \_ -> add1 
12. 最後はちょっと省略しますが、ご想像のとおりこんな形になります
  State $ \s -> ((), (1 + (1 + (1 + s))))

execState関数は"execState m s = snd (runState m s)"ですのでSample1.hsの
main関数では3が表示されます。
ややこしかったかもしれませんが、型にさえ気をつければ、基本はただ展開し
ていくだけなので、実はそれほど難しくはありません。
ちょっと駆け足になってしまいましたが、Stateモナドは状態をもった処理を部
分適用された関数の合成で表現していると言うことができます。それをdo構文
により、あたかもget関数で状態を取り出してput関数で状態を保存しているよ
うに見せているところがモナドの偉いところだと思います。(西川)

[*1] : http://www.objectclub.jp/ml-arch/magazine/225.html
[*2] : デシュガー(脱糖)という処理にあたります
[*3] : m >> k = m >>= \_ -> k
_______________________________________________________________________
この記事への評価にご協力をお願いします。
URLをクリックして、「ご協力ありがとうございました」のメッセージがご使用
のブラウザに表示されれば投票完了です。
良かった:
http://www.ObjectClub.jp/community/object_ml/estimate?vol=E008-16&choice=0
普通:
http://www.ObjectClub.jp/community/object_ml/estimate?vol=E008-16&choice=1
イマイチ:
http://www.ObjectClub.jp/community/object_ml/estimate?vol=E008-16&choice=2

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ■━
■
┗【コラム】東京マラソン2008参加レポート

オブジェクト倶楽部の皆さん、こんにちは。
私は、永和の金融部門で働いています、山川といいます。
仕事は、某メガバンクの汎用機システムの保守開発をしています。

●私のストレス解消法

よりよい仕事をするために、読者の皆さんそれぞれに工夫されていることがあ
ると思います。ストレス解消のメニューを充実させること[*1]も、そうした工
夫の1つではないでしょうか。今日は、私のストレス解消メニューでもある「マ
ラソン」について、読者の皆さんのQoEL[*2]のお役に立てればと思い、東京マ
ラソン2008の参加レポートと合わせて紹介させてもらいます。

●マラソンのきっかけ

2001年の夏、知り合いから「君も一緒に走ろうよ」と声をかけられたことが
きっかけで、私はマラソンをはじめました。最初は10キロ走るのもやっとだっ
たのですが、いまの職場のお客様から、「ハーフ以上走らないとマラソンじゃ
ない」と言われ、一緒に練習をしながら、長い距離も走れるようになりました。
練習と言っても、一緒に大会に出たり、大会前のリハーサルをやったりと、そ
の程度なんですが、練習後は必ず懇親会と称して飲みにいきます。走ったあと
は、また格別の味がするもので、こういう楽しみがあるからこそ、続けられて
いるのだと思います。

●初めてのフルマラソン

私が初めてフルマラソンを走ったのは、いまから3年前。荒川市民マラソンとい
う大会でした。荒川の河川敷を往復するというコースなんですが、都心ではと
ても参加者数の多い大会です。そのときは、なんとかゴールには辿りついたも
のの、フルマラソンの厳しさを思い知りました。いま思えば、沿道の声援に背
中をおされ、ついオーバーペースになってしまい、スタミナ切れをおこした結
果でした。

●皇居での練習

今回、東京マラソンに出場するにあたって、3年前の轍は踏まないと決め、皇居
での練習をはじめました。平日は時間がとれないので、主に週末の練習です。
皇居は1周約4.5キロ。信号で止まることもなく、適度なアップダウンもあり、
練習には最適のコースです。
また、他のランナーの方も大勢走っているので、とても励みになります。
練習では、1周あたりのラップをとり、自分がどれくらいのペースで走れるの
か、疲れはどうかなど、セルフチェックをしながら、距離を踏んでいきました。

●いざ、東京マラソン!そして、夢は海外へ

大会当日は少し肌寒さを感じつつも、晴天に恵まれ、絶好のマラソン日和。
3万人を超えるランナー、沿道の人垣、声援に励まされ、ランナー冥利を十二分
に味わいながら、「マイペース、マイペース」と心で何度も復唱しつつ、コー
スを駆けました。
私の目標タイムの5時間を切るためには、レース後半にいかにスタミナを残せる
かがポイントです。
ちょうど浅草寺(雷門)を折り返したあたりからは、給食ポイントのバナナ以外
にも、沿道の方が手渡しされる飴やチョコをいただきながら走りました。
これは、ホント、ありがたかった!
マラソンは30キロを越えてからが本当の勝負だと言われますが、1キロ毎のラッ
プに「これでよし!」と自己承認できたことも、自信をもって最後まで走りき
る原動力になりました。
ゴールしてみれば、目標の5時間を切るタイム[*3]で、自身初のフルマラソン完
全完走を達成することができました。
7年前は10キロも走れなかったのに、地道ながらでも続けてきたことが、今回の
結果につながったんだと思っています。
将来の夢であった、海外のマラソン大会出場もようやく視野に入ってきて、楽
しみも広がりました。
いまでは、マラソンが私の最高のストレス解消法となっています。

●これからマラソンを始めてみようかな、という人へ

私のオススメは、「ぜひこれは!」と思う大会をきっかけに、気の合う仲間を
誘って参加してみるのがいいのでは、と思います。
東京マラソンには10キロ部門もありますので、ぜひ来年チャレンジしてみては
いかがでしょうか。(山川)

[*1] : 参考図書 『ストレスをパワーに変えるセルフコーチング』
      高原恵子著 実業之日本社
       http://www.amazon.co.jp/o/ASIN/4408322997/xpjp-22
     ストレス解消のメニューを充実させるポイントは、以下の通り
    ・五感を使って脳をリラックスさせること
    ・心地良いという感じが大事

[*2] : QoEL : Quality of Engineering Life
       エンジニアとして人生の時間の質
       http://www.objectclub.jp/community/pf/

[*3] : 私の記録はこちら
    http://tokyo42195.org/numberfile/39492.html
_______________________________________________________________________
この記事への評価にご協力をお願いします。
URLをクリックして、「ご協力ありがとうございました」のメッセージがご使用
のブラウザに表示されれば投票完了です。
良かった:
http://www.ObjectClub.jp/community/object_ml/estimate?vol=H003-46&choice=0
普通:
http://www.ObjectClub.jp/community/object_ml/estimate?vol=H003-46&choice=1
イマイチ:
http://www.ObjectClub.jp/community/object_ml/estimate?vol=H003-46&choice=2

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━--■--●--■ 
■
┗【アンケート】気になるシステム業界 ホントのところ

今週は「Agile2008は行きますか?」のホントのところ。今年は8月にトロント
で開催されるようです。さて、皆さんはAgile2008は行きますか?
Agile2008 Conference http://www.agile2008.org/

  自腹で既に行くことにしました。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=190&choice=0
  会社の出張で参加です。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=190&choice=1
  自腹で参加して、スピーカーになっちゃうかも!
     http://www.ObjectClub.jp/special/kininaru/vote?vol=190&choice=2
  出張で参加して、スピーカーになっちゃうかも!
     http://www.ObjectClub.jp/special/kininaru/vote?vol=190&choice=3
  それって何でしょうか?
     http://www.ObjectClub.jp/special/kininaru/vote?vol=190&choice=4
  仕事の都合で残念ながら行けません。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=190&choice=5
  今のところまだ予定を調整中。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=190&choice=6
  オブラブメルマガの参加体験記に期待。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=190&choice=7
  それは秘密です。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=190&choice=8
  ちょっと語らせて!
     詳細をこのメールに返信ください!!

アンケート結果はオブジェクト倶楽部サイト上にて公開します。お楽しみに。
なお、前号「煮詰まったとき何をしますか?」の結果は公開中。ぜひご覧下さ
い。
⇒http://www.ObjectClub.jp/special/kininaru/vol189/PlonePopoll_results2
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━--■--●--■
■
┗編集後記

こんにちは、編集人です。週末は強烈な春一番が吹きました。風速20メートル
以上の風はなかなか体験できないのでその威力に驚きましたが、もうすぐ春が
やってくる証なんですね。花粉症なのか風邪なのかの区別ってどうするのか?
不思議に思っていたんですが、鼻水がさらさら、熱があまり出ない、毎年同じ
時期に症状が出るなどが花粉症の特徴のようです。自己診断だけではなく、お
かしいな?と思ったら、医師に診断してもらうのがお勧めです。仕事にも影響
出る人もいると思いますので、大変になる前に早めに対応がいいですね。

今週の強引な一言
*** 朝令暮改(ことわざ)***
朝下した命令を夕方には変更する。法令がひんぱんに変わって、一定しないと
いう意味。ソフトウェアの開発プロジェクトでは、すでに指示命令を夕方まで
待てなくなりました。指示が来るのを待ってませんか?必要な変化は自分たち
で起こさないと間に合いませんよ。
出典参考:故事ことわざ辞典 東京堂出版
(上田雅美)

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━--■--●--■
● ご意見、ご感想は         ⇒このメールに返信ください
〇 配信中止、アドレス変更は ⇒http://www.ObjectClub.jp/community/object_ml/help/
〇 免責事項、過去の記事は   ⇒http://www.ObjectClub.jp/community/object_ml/
■ 発行:オブジェクト倶楽部 ⇒http://www.ObjectClub.jp/
■ 編集代表:平鍋  健児
Copyright (c)2003-2008 オブジェクト倶楽部. All Rights Reserved.
powered by Eiwa System Management, Inc.