OCaml Meeting 2010 in Nagoya

8/28 に、OCaml Meeting 2010 in Nagoya に行ってきました。

朝早く起きて名古屋大学へ。
暑い・・・

  • やってみようOCaml / Walk with OCaml
    • OCamlの基礎についてのお話
    • 会場の人の殆どはOCamlでプログラムを書いたことがあるみたい
    • haXeって言語がある
    • 高速で動作して欲しいときは ocamlopt を使うとみんなハッピーになれる
    • OCamlラムダ計算 (λ+ :ラムダプラス)
λterm ::=
 | x
 | λterm λterm
 | fun x -> λterm
追加で
 | 定数・リスト
 | バリアント・ペア
 | let, match, if
さらに
 | 代入可能な変数・ループ・モジュール
 | 多相バリアント・オブジェクト
さらに最新版(3.12)からモジュールが第一級に
    OCamlどこいってしまうんや
    • OCamlのいいとこ
      • 強力な型チェック
      • nullがないっていうのは非常に良いこと
        • nullがあっていいことなんて一つもないのに、なんであるのかわからない
      • 実行効率いい
      • Coqとの連携が用意
    • OCamlTwitterクライアント ocamltter
      • OCaml対話環境内で動く
      • 激しくRTするもの簡単w
    • まとめ
      • 型安全で高信頼
      • 仕事で使うと健康になる
      • より高信頼にしたいときはCoqで証明
  • F# の流技 / Fluent Feature in F#
    • OCaml △!
      • → F# △! → F# |>
    • パイプライン演算子 |>
      • let (|>) x f = f x
    • F# は inline 関数が書ける (コンパイル時に展開)
      • |> は inline
    • オブジェクト指向
      • x.F().G().H()
      • x |> f |> g |> h
    • F#「OCamlと違うんです」
      • + 演算子とか
        • 関数オーバーロード
          • 型推論と相性悪い
    • F# の対話環境は fsi
    • 画面出力 System.Console.WriteLine
      • オーバーロードされている
    • F#「.NETですから」
      • OCaml と比べると 型推論 (´・ω・`)ショボーン
      • F# ではよく型を明示する
        • |> 使うと型も流してくれるので型明記を少なくできる
    • 単位付きの計算ができる
    • コンピューテーション式
  • OCaml 3.12における第一級モジュールと合成可能なシグネチャについて / First-class modules and composable signatures in OCaml 3.12
    • モジュールの役割
      • プログラム・名前空間の構造化
      • インタフェースによる仕様記述・部品化
      • 抽象型・プライベート型による隠蔽
      • ファンクタによる抽象化
    • モジュールがコア言語より優れている点
      • 型構成子に対する多相性がある
      • 正確な多相型要求
      • 存在型(抽象型)の定義
    • 3.12の新機能
    • 第一級モジュール
      • モジュールを通常の値のように受け渡しできる
        • モジュールを受け取る関数とか作れる
        • パラメータによって、使うモジュールを選択したりできる
        • クラスをモジュールに入れて、中のクラスを動的継承によって変更したりできる
        • 型の等式を表現できる (GADTs)
      • 完全に型付けされている
        • 安全!
      • 理論的には新しくない (10年前に出てる)
        • ファンクターとの干渉で安全でなかった
    • 第一級モジュールの制限
      • ファンクターの中では第一級モジュールを開くことは出来ない
      • 型の pack, unpack を全て書かなければならない
        • 多相メソッドと同じ機構を使って、多くの型注記が省ける
    • シグネチャ言語
    • 破壊的代入の制限
      • 代入をかけれるのは一番上レベルの型とモジュールのみ
      • パス (定義されているもの) しか代入できない
      • 型のパラメータ数。順番は変えられない
      • 削除によって、構文的にスコープが有効でないシグネチャになったりする
  • デザインレシピ、モジュール、抽象データ型 / Design Recipe, module, and abstract data type
    • デザインレシピ
      • データ定義を行う
      • 目的を考え、ヘッダを作る
      • 例を作り、それをテストプログラムにする
      • テンプレートを作る
      • 本体を書く
      • テストする
    • → 例 (テスト) が先!TDD!

プログラミングの基礎 (Computer Science Library)

プログラミングの基礎 (Computer Science Library)

  • Spot Your White Caml -- How to Make Yourself Happy in OCaml Projects
    • コードの成長が早くて、初めからいて少しずつ進化していくなら対応できるが、十分成長したコードをいきなり見ると辛い
    • どうやって OCaml のコードを読むか
      • まず、mli ファイル (インタフェース) を読む
      • ml ファイル (実装) は飛ばす
    • よい mli ファイルを書く
      • 実装の詳細は隠蔽する
      • どう使うか示す
      • 良い・短いコメントを付ける
      • 型で表す
      • ocamlc -i から始めると良い
    • 良くない mli ファイルは読まない
    • 良い質問
      • 何が書かれているか・どこにあるか は無駄
      • 何故 を聞くと良い
    • 時間の80%は検索に使うので、検索に使う時間を減らす
      • シンタックスハイライト
      • 手動検索
      • Grep
        • cmigrep
        • ocamlbrowser
        • ocamlspot
      • Tag
    • → 検索時間が半分になれば、3倍生産的になれる
    • 以下のような先輩の助言は無視
      • Grepで何とかなるよ
      • 手動検索も学習だ
      • すぐ慣れるよ
    • コンパイラに関連した解析ツールを使う
      • 型推論は便利だけど、コード中でこの変数の型なんだっけ?ってなりやすい
        • 変数の型を調べてくれるエディタ拡張がある
    • ocamlspotter
  • Lightning Sessions
    • FFTW/genfft誰得ハッキングガイド / The Hitchhacker's Guide to the FFTW/genfft
      • FFTW
        • The Fastest Fourier Transform in the West : 西洋最速のフーリエ変換
        • 支えているのは OCaml
          • コード自体は C だが、OCaml から生成されている
      • ループがないので、ループは OCaml 側で描く
      • C コード生成時に最適化する
    • OCaml版Hoogle、OCamlAPISearchの紹介
    • どーOCaml
      • http://ocaml.jp/cgi/docaml/docaml.cgi
      • fizzbuzz
        • when で分岐出来るが、タプルでmatchするといい感じ
      • メールアドレスフィルタ
        • メールアドレスをファイル名と見て、Filename.check_suffix で判定
        • String.is_suffix で判定 (Core ライブラリが必要)
      • ファイルコピー
        • Maybeモナドを作って、失敗しうる処理を連結
        • モジュール内にモジュールを作る
      • SQL文生成
        • エスケープを Str.global_replace で行う
        • プリペアドステートメントは PGOCaml ってのがある
      • どーOCamlOCamlで作られている
    • ゴルフ用楽打モジュール
      • goruby
        • Ruby の Golf 用公式インタラプタ
      • rakuda
        • gorubyOCaml
        • id とか % とか関数合成とかもある
        • h() で "Hello World!"
        • 標準入力から読み込む系もある
        • format 系の演算子もある
        • ビット演算用の演算子もある
        • 文字列操作・正規表現用の演算子もある
        • リスト操作・生成用の演算子もある
        • eval もある (型 (´・ω・`)ショボーン )
        • 関数適用もある (例外無視)
  • もの
    • 念願のグリーンバンドを手に入れた
    • OCaml Tシャツ 買った!