第11回名古屋Scala

9/17 に、第11回名古屋Scala勉強会に参加してきました。

今回は23章と24章の予定だったけど、盛り上がったので24章は次回に。

  • 23章 for 式の再説
    • モナド (1)
      • bind : M[A] => (A => M[B]) => M[B]
        • 最初の M[A] がレシーバ (Scala)
      • return : A => M[A]
      • この 2 つがあるとき、M は モナド (Haskell, do式が使える)
      • 不思議な抽象だけど、いろいろ便利
        • 例:リスト、Option (Maybe), IO処理、メモリ状態、パーサ、etc.
      • Scala だと、bind は flatMap、return は 単一コンストラクタ (ユニットコンストラクタ) に対応
      • for 式を使うには、map が必要 (map : M[A] => (A => B) => M[B] (Scala, 最初の M[A] がレシーバ))
        • flatMap と 単一コンストラクタ から作成できる
          • map (f) = flatMap (x => new M(f(x)))
        • do 式の return は、Scala だと for 式の yield に対応
          • ただし return と違って途中で使えない
    • F# のコンピューテーション式
      • Bind と Return メソッドを持つ型を作ると、do式っぽいものが使える
        • モナドの bind, return とは違う (↑はモナドにならない)
        • 何かよく分からないもの
    • モナド (2)
      • モナドは、bind と return について、右/左単位元を持ち、結合則を満たさないといけない
      • filter はモナドと関係ない
        • filter は ゴミw
        • モナドプラス に guard ってのがある (filter よりもっときれい)
    • パターンマッチ
      • 忍者パターンマッチ
        • パターンマッチで変数を定義する
scala> val h = ("hoge", 99)
h: (java.lang.String, Int) = (hoge,99)

scala> val (name, age) = h
name: java.lang.String = hoge
age: Int = 99
      • ドラゴンパターンマッチ
        • パターンマッチで無名関数を定義する
        • p.430 inCheck ドラゴンパターンマッチによる実装 ↓
scala> def inCheck:((Int,Int),(Int,Int))=>Boolean = {
     |   case ((x1,x2),(y1,y2)) => x1 == y1 || x2 == y2 || (x1 - y1).abs == (x2 - y2).abs
     | }
inCheck: ((Int, Int), (Int, Int)) => Boolean
  • こんなの書きました
    • bleis とん
      • テスティングフレームワーク作ってみた
        • パラメタライズドテスト書きたい
        • テスト仕様書とかテストケースから自動生成したい
          • Excel とか大変
    • leque さん
      • lift で ファイルビューワ的な
        • lift でクロージャ → いい感じに js に!
      • dump
        • List("") とかをいい感じに表示してくれる
        • REPL のなかとか、こう...
        • 2.8 から catching が使える
  • bleis宅

次の日に Gitの勉強会 があったので、泊めてもらうことに。
wk6 と mrxptn も一緒。


bleis と F# の話してたりして、気付いたら 3時。
そこから (みんな寝てから)、化物語の最終巻と AB を見る。
・・・・・・
天使ちゃんマジ天使。
・・・・・・
お、2人起きた。(6時くらい)
・・・・・・
天使ちゃんマジ天使。
・・・・・・
昼か。(11時くらい)


wk6 は別の勉強会らしく、少し早く出てた。
3人で名古屋駅でラーメン食べて、Git勉強会へ。