夜から降っていた雨は午前中までつづいたが、午後から晴れてきた。で、けっこう気温も上ってきて手が冷たくなるようなこともなく。

3de55fdd.jpgd4ab5abc.jpgd12a31ec.jpgいつものようにベルポート内のベースキャンプであるところのマクドナルドで昼食。ビッグマックが200円なのでひさしぶりにたべた。ハンバーガー2個も200円なのでそっちの方がバンズ1枚ぶんおとくなんだけど、ビッグマックのソースもたまにはいいかな。中のレタスがボロボロの細切れになってて箱のなかで山積になってた。ビッグマックのあとはマックポークの濃い味で〆。

1階で待っている間にカズさんにIPv6の話をちょっときいた。WIDEでのIPv6生活は昔からやってたとのこと。たぶん今回の話はWindows,Mac,Android,iOSでやるというのが新しいところだったのかもしれない。カズさん曰くIPv6はアドレス空間が広いだけだと世間では認識されてて当初いろいろやりたかったことはIETFの多数決で無難な感じなところに着陸してしまった、とのこと。

[2011-12-03 13:13]

第10章:型とクラスの定義 / @ruicc, ruicc.rail@gmail.com

  • http://www.slideshare.net/RuiccRail/programming-haskell-chapter10
  • 型クラス(10章の内容は省略)
  • Haskell Advent Calendar
  • OOのクラスからHaskell型
  • OO: クラス→(継承)→クラス→インスタンス
  • Haskell: 型クラス→(インスタンス化)→型インスタンス→値
  • OOのクラス = 型クラス + 型
  • 型クラス= OOメソッド
  • 型 = OOフィールド
  • 状態: おおいなるバグの母
  • 型とは集合である
    • 直積構造: tuple,vectorなど
    • 直和構造: 排他的なもの、True or False
    • 再帰構造: list,tree
  • data宣言: 型構成子(=の左)と値構成子(=の右)
  • typeは値構成子がない
  • OO直和構造はフラグやステートパターンをつかう。
  • OO再帰構造はコンポジトパターン、ビジターパターン
  • OOのクラスではパターンの粒度が大きい。意図がばらける。オブジェクトをまたいだ処理がにがて。
  • Haskellにはprivateはない。状態がないHaskellにはいらない。直和構造で十分。ただパフォーマンスの観点からは必要→module。
    • OOは状態をもつ→隠したい→XXX
    • Haskellはデータの書き換えができないのでprivateにしなくてもバグらないXXX
    • getter/setter:
    • Haskellではパターンマッチでデータは丸見え。
    • privateの話と直和は別にした方がいいかも(by kazu)
  • mouleやwhereで関数は隠せる。
  • OOPで列挙型がほしくなるのは直和がないから。
  • 継承とはなんだったのか→本当の多重継承というのもおみせしますよ!
  • 型の継承
    • フィールド非依存
  • 実装の継承
    • 実装がフィールドに依存しているのが重要
  • 型クラス→型クラスの継承はメソッドだけの継承に相当
  • OOでは継承するごとにメソッドのオーバーライドが何度でもおこりうる。
  • Haskellでは型にインスタンス化するときにだけオーバーライド。
  • 型クラスは多重継承できる。
  • C++では開発者が名前がぶつからないように気をつけるしかない。マクロやコードジェネレータで違いがでるのではないか。
  • 型クラスはScalaのTraitに似ている。
  • 型クラスの継承は関数の型制約とおなじかたち。
  • derivingは継承をかんたんにするための黒魔術。9種類は簡単にできるようになってる。
  • 型クラスは2種類ある: instance Eq (Maybe Int), instance Monad Maybe
  • モナド: 要素としてはコンテナと中身しかない。メソッドはそのどちらかに作用するしかない。
  • 関数どうしの比較はできないが、
  • 型クラスはOOのインタフェイスとほぼおなじ。デフォルト実装を持てるのが違う。
  • Javaのhaskellでいうところのクラスと型について
    • open classがあるやつだとxのところはoになるとおもう。
|       | 既存クラス | 自分クラス|
|既存型 | x          | x         |
|自分型 | o          | o         |

[2011-12-03 14:22]

d5dc5d1c.jpg休憩

[2011-12-03 14:25]

11章 切符番号選び / @dekosuke

  • http://www.slideshare.net/dekosuke/programming-haskell-chapter-11
  • twitterの数字遊び: つかえる演算がきめられてないのでかなりむつかしかったり。
  • solutionの関数は何のためにあるのか?
  • Hugsなのは昔はGHCのインタラクティブシェルがなかったから。
  • 数のリストに対して階乗で組み合わせが爆発する。

[2011-12-03 14:46]

休憩

Q: p133の「技術的な理由」とは?

A: かずさん・虎さん: わからない。

[2011-12-03 15:07]d8496e0a.jpg

モナモナ言わないモナド入門 / 山本和彦

  • http://mew.org/~kazu/monad.pdf (暫定)
  • モナドという言葉を知っている人 100%
  • みんなわかってないとおもう人 100%
  • わかっている人 数人
  • 抽象的な説明からではわからない。
  • 統一理論と大統一理論
    • 物理学の力(電磁気力・弱い力・強い力・重力)を
    • 重力がまだ統一されていない。
    • 4つ力があるということを知っていて、これを統一したいというのがあるから。大統一理論をトップダウンであたえられても理解できない。
Parser --|
         |-- 状態系 --|
IO     --|            |
                      |-- コンテナ
Maybe  --|            |
         |-- 失敗系 --|
List   --| 
  • 抽象化オタクがいたらParserとIOのwrapとbindを型クラスにしたくなるはず。
  • 状態系は関数のなかに関数がはいっているから初期値を与えて走らせないといけない。 → run
  • IO構成子はexportされていないのでパターンマッチできない。ユーザが実行できない。ランタイムにおねがいするしかない。
    • OO用語でいえば、IOのコンストラクタがprivateになってる、みたいな。コンストラクタはwrapだからちょっとちがうけど。
      • module Parser(Parser(Parser))where
      • module IO(IO)where
      • module モジュル(型(構成子))
  • 失敗系
  • おばあちゃんを探せ: 親DBがあって母はわかる。ひいおばあちゃんとか、どうすんだ? 三重ifになってきたなくなる。
  • BoolのTrueに値を持たせたものがMaybe
  • 記号は二項演算子
  • 記号のデータ構成子:ではじまる (Listは:だけの特別なやつ)
  • Maybeは答が0か1個。
  • Listは答が0個以上。
  • Maybeの合成にたいして、Listの合成は複数の場合は掛算ということに決めた。決めの問題。掛算ではなく、タプルにしただけのzip listというのもある。
  • Failable
  • 大統一理論
  • ひらめいてコンテナという形になることにきづいたらしい。
  • Programable
  • コンテナは文脈: 文脈がまざらないのが大事。Parserどうしは組み合わせるけどIOとParserは合成できない。
  • コンテナの力の階層
    • >>= プログラム可能コンテナ (力が強い) (doはここ)
    • <*>,return 逐次コンテナ
    • <$> マップ可能コンテナ (力が弱い)
  • チューリング完全
    • 構造化定理: 逐次、分岐、反復これらがあればアルゴリズムがつくれる。
  • mapを一般化した<$>: fmap
  • <$>をもつコンテナのクラスをMappableとよぶ
  • (f <$>) :: m a -> m b
  • pureなfを文脈に持ちあげる(lift)、という。(liftingという名前が先にあった?) pureな世界よりも文脈の世界が上にあるらしい。
  • <*>: ap: m (a->b) -> m a -> m b
  • (+) <$> Just 1 <*> Just 2 → Just 3
  • 逐次コンテナ Sequential : Mappableを継承。
  • <$>と<*>で逐次処理ができる。うーんよくわからん。とりあえずdo構文を<$><*>で書き換えられるというのが根拠。
  • 分岐は >>= (bind). コンテナの中身をみて処理をかえたい。
  • 階層
    • プログラム可能コンテナ >>= Monad (強)
    • 逐次コンテナ <*>,return Applicative
    • マップ可能コンテナ <*> Functor (弱)
  • モナドはメタパラダイム @tanakh
    • モナドで統一したのはチューリング完全だからじゃね?
  • モナドの神話
    • モナドが実行順序を制御をする (IOではbindが実行順序を制御するように実装されている)
    • IOモナドは副作用をカプセル化を守る
    • IOモナドが参照透明性を守る
    • 圏論がわからないとhaskellはつかえない
  • 実際のhaskellではFunctor,Applicative,Monadの階層がぐちゃぐちゃ。
  • MirandaからList内包表記がはいってきて→doができてモナド内包表記ができた→エラーメッセージがわかりにくいという理由でList内包表記に戻された→糖衣構文を解く前のでエラーを出せばいいんじゃね→SQLもいけるぜ(いまここ)
  • ParserではApplicative
  • IOはdo
  • Maybeは>=
  • Listは内包表記
  • Typeclassopedia: http://snak.tdiary.net/20091020.html

[2011-12-03 16:22]

質疑応答

[2011-12-03 16:34]41ce8fbf.jpge3f506ae.jpg

休憩

[2011-12-03 16:54]0816eb74.jpg

グループワーク

  • 演習問題 10章3
  • TreeMap

今回の演習は初めて雑談しながらやった。(このテーブルだけだったかもしれないけど)

[2011-12-03 18:01]

おわり

あしたは水泳大会なので懇親会は遠慮させてもらった。日本でいちばんうまいビールが飲めるとか。

750adcd2.jpg