当日の朝までかかってアプリカティブ章とモノイド章まで読んだけどモナド章は間に合わず。あかるくなった空をみとどけ布団で4時間寝て会場へgo!

K3410703K3410704K3410706K3410707DSC01722 (1)

DSC01724DSC01726DSC01728DSC01730DSC01732

最後尾に陣取って昼飯。

DSC01733

諸注意DSC01734DSC01735

  • この会場はじめての人も何人か。
  • 近くの自販機にはcoldしかないよ。
  • テザリング禁止

DSC01737

[2012-11-18 13:03]

第12章 モノイド / @apstndb DSC01738

  • http://www.slideshare.net/ShintaHatatani/h-12-15228437
  • newtypeだとコンパイル時のオーバヘッドしかない
  • dataでつくった型コンストラクタだと使われなくてもコンストラクタ呼びだしを確定させるために引数の型を早く調べる?
  • mappendは <> がつかえるようになった (GHC)
  • たたみこみのためにmemptyは必要。
  • Num aはクラスなので型じゃないのでListやBoolと同列にitemizeするとちょっとおかしい。(kazu)

[2012-11-18 13:50]

  • Q: mappendの順番が重要だが、Monoidの性質によるはず?
  • A: 左たたみこみの定義をそうするか?リストにしてからfoldrした結果と同じになるようにすべきらしい。
    • 深さ優先探索でもpreorder,inorder,postorderがあるうちの1つを選んだだけにすぎない。(kazu)
    • p279の「mappend..順序にさりげない配慮が光ります」は誤訳かも?原書にはなさそう。村主さんがノリで書いた?(kazu)
    • 回答→ https://twitter.com/kazu_yamamoto/statuses/270790404889251840

[2012-11-18 14:02]

[2012-11-18 14:03]

あなたの知らないMonoidの世界 / @kazu_yamamoto DSC01740

  • http://mew.org/~kazu/material/2012-monoid.pdfa
  • みなさんは群って聞いたことありますよね?
  • まわりはMonoidだらけ
  • 半環はすごい。
  • この本を読んだだけでは、おれはモノイドはつかわねぇ、っておもいますよね?
  • doctestでテストの結果を集計したい。でも単に足し算したいだけじゃね?
  • Numじゃないとダメな理由 → かけ算割り算はいらない、足し算だけでいい。
  • tanakhさんが、とつぜんFizzBuzzに割り算はいらないといいだした。 → やりすぎなMonoidなFizzBuzzができた。
  • <>は別名なので定義のときは mappend を書かないといけない。
  • Monoidで実装して試験官を困らせよう。
  • プログラム自体もMonoid。プログラム自体をデータとしてあつかえるのもMonoidを操作しているだけ。
  • mappendで連結系はlist,Sum、選択系はMaybe。
  • AlternativeとMonadPusの(<>)とmplusは同じ関数シグネチャ。MonadPlusはいらない子(Alternativeをつかえ)。Monadの制約が必要になって強すぎる。
  • コンテナにかぎっては連結している感じは必要なくて選択する感じだけでよい。

[2012-11-18 14:19]

[2012-11-18 14:20]

第13章 モナドがいっぱい / @brain_apple DSC01741

  • http://www.slideshare.net/KentaSato/ss-15225450
  • 「生物系なのになんでモナドの紹介してんだろ」
  • モナドチュートリアルが無限に増えつづける.. また1つ増えます..
  • returnとpureはおなじ型
  • 引数の順番を変えると第2引数が違うだけ
    • Functor: (a -> b)、 Applicative: f (a->b)、 Monad: (a -> m b)
    • bindを説明するためにあえて
  • Functor/Applicativeでは、コンテキスト値をみてJust/Nothingかどうか判断することはできない.
    • <$>は値をいじるだけ
    • <*>は文脈のなかの値をいじるだけ
    • >>=は文脈を変えられる
  • リストモナドをつかうと複数の候補がある計算を自然に書ける。
  • 「MonadPlus いならい子 書いてあったので紹介します」
    • mzeroは失敗、mplusは選択。
  • MonadPlus m => は Monad m,Alternative m =>と 書けるが、歴史的経緯でグシャっとなってる。
    • そのときはmzeroはmemptyに
  • guardはリスト内包表記でつかう。
  • 型を書いてたら「これモナドじゃん!」て気づくとがおおいらしい

[2012-11-18 15:03]

  • Q: typeclasspediaはよめる?
  • A: 型クラスってこういう構造をもってるんだぁとかわかって全体像がわかる。
    • typeclasspediaを書いた人は圏論の専門家ではない (kazu)

DSC01742DSC01745

[2012-11-18 15:05]

休憩 DSC01746

  • undefinedはふつうはつかわない (kazu)
    • undefindはnull pointerとはちがう。
    • 関数を未定義状態にしてコンパイルをとおすためにつかう。
    • あとlazyになってるかどうかチェックするのにつかったり。
    • CoolBoolの例はnewtypeだと hellowMe (CoolBool _) は helloMe _ になる。dataでも helloMe (CoolBool undefined) だと例外は投げられない。
% cat -n foo.hs
     1  data A a = A1 a deriving (Show)
     2  newtype B b = B1 { getB :: b } deriving (Show)
     3  fa (A1 _) = "A"
     4  fb (B1 _) = "B"
% ghci foo.hs
GHCi, version 7.4.1: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
[1 of 1] Compiling Main             ( foo.hs, interpreted )
Ok, modules loaded: Main.
*Main> fa (A1 1)
"A"
*Main> fb (B1 1)
"B"
*Main> fb undefined
"B"
*Main> fa undefined
"*** Exception: Prelude.undefined
*Main> fa (A1 undefined)
"A"
*Main>

[2012-11-18 15:32]

モナモナ言わないモナド入門」第二版 / @kazu_yamamoto DSC01747DSC01748

  • http://mew.org/~kazu/material/2012-monad.pdf
  • 前回のスタートHaskellの改訂版
  • 「テストでモナドとは言語内DSLという回答があったら満点をあげたい」
  • 数学屋だと「具体的すぎてわかりません。抽象化してださい。」っていわれるけど、ふつうの人は具体的じゃないとわからない。
  • すごいH本にはパーサーの例がでてこないけど、プログラミングHaskellでは1章つかって説明があった..
  • ランタイムはrunIO main worldを実行している。
  • 抽象化オタクは抽象化するメリットは言わない。抽象化するのが目的だから!
  • 木の探索で失敗系をあつかうのに手続き型ならバックトラックを実装するがHaskellなら遅延評価があるので「全部とってこい」と書ける。
  • コンテナ: Programmable m, wrapとbindをもつ。
    • 失敗系でもdoがつかえる。
  • 文脈という言葉をつかうのをやめた。つっこまれることあおおいので。これからはDSL。
  • Q: Nothingが途中できたら止まる?
  • A: `lookup`が連鎖すると左結合なので最後までいっちゃうけど、コンパイラの最適化で右結合になるらしい? 途中離脱するには右結合になってないといけない。
  • [強] プログラム可能コンテナ>>= ←→ 逐次コンテナ<*>,return ←→ マップ可能コンテナ<$> [弱]
  • チューリング完全: 逐次・分岐・反復があればアルゴリズムは実現できる。書き易さのちがいはあっても力はおなじ。
  • 「mapがわからない人は関数型言語はやめた方がいい」
  • <$>: 関数をDSLに持ち上げる(lift)、という。
    • (+) <$> [1,2,3] → [(1+),(2+),(3+)] になる(表示できないけど)
  • <*>はアプと読む。
  • pureってみんなつかわないからreturnってする。
  • <*>は2引数なので再帰が書けて、<*>で反復と逐次が書ける。1引数で再帰を書くと単なる無限ループ。分岐は >>=
  • Control.Monadでwhenがつかえる。
  • 糖衣構文のdoがMonadを特殊にしている。
  • >>はゼンと読む。
  • ParserはApplicativeで書ける。書けなかったら設計がおかしい。
  • Maybeでdoをつかうかどうかは宗教戦争。連鎖だからdoを使わない派(kazu)
  • Functorは↓と書けるのが重要。この様式が重要:
do args <- getArgs
   let args' = checkArgs args
↓
do args <- checkArgs <$> getArgs

DSC01761

  • Q: Applicativeが安全とは?
  • A: 力が弱いので分岐とかしてないぞと分かる。文脈依存なパーサーはほとんどなくてプリプロセッサを通すのがほとんど。ApplicateiveならBNFだが、逆はなりたたない。
  • Haskellの内包表記はリストに制限されていているのでリスト内包表記。(昔はモナド内包表記といっていた)。Miranda譲り。
  • Haskellの仕様は2年おきに改訂?
  • LINQみたいなことをHaskellでやりたいのでモナド内包表記がカンバックするかも。

[2012-11-18 16:53]

DSC01754DSC01759DSC01760

DSC01756

「おめでとうございます」by @seizans

[2012-11-18 16:56]

LT: モナモナ言うモナド入門.tar.gz / @hiratara DSC01763

[2012-11-18 17:03]

  • 自己関手圏のモノイドならMonad.
  • ここでは数学でいうところのモナドの話をした
  • 理解するにはいろいろな本を読むしかない... 日本語の本はほとんどない...
  • 理解するメリットは? → 抽象化オタクになれます!
  • Haskellの中だと自己関手しかありえない。
  • 関手とは型と関数という理解で、だいたいok。

DSC01762DSC01764

[2012-11-18 17:10]

LT: Haskell advent calendarの宣伝 / @Lost_dog_ DSC01767

DSC01766

[2012-11-18 17:12]

LT: ゆるいフットサルの宣伝 / @kazu_yamamoto

[2012-11-18 17:14]

LT: C83 λカ娘の販促にやってきました / @master_q DSC01771

DSC01770DSC01772DSC01773DSC01774DSC01775DSC01776DSC01777DSC01778DSC01779DSC01780DSC01781DSC01782DSC01783DSC01784DSC01785DSC01786DSC01787

[2012-11-18 17:31]

LT: モナド則補足 / @kazu_yamamoto DSC01789

  • >=> なんちゃら結合演算子
  • モナド則はモノイドのようであってほしいとの願い。

DSC01788DSC01790DSC01791DSC01792DSC01793DSC01794DSC01795DSC01796DSC01797

[2012-11-18 17:40]

次回(最終回)

  • 1/19土曜の予定