YAPC::Asia 2006 Tokyo: Learning Haskell by Audrey Tang

YAPC::Asia 2006 Tokyoの2日目の午後からAudrey Tangさんの「Learning Haskell」のプレゼンテーションがありました。

はてなから音声ファイルが公開されています。スライドも見られるようになりました。ありがとうございます。

話の内容が高度なだけに、理解するのが中々難しいです。予めHaskellの予習をしておいたので、前半は何を伝えようとされていたのかおおよそわかりました。

個人的には、後半の

  • Monad Transformers
  • QuickCheck
  • Parsec
  • Software Transactional Memory
  • Foreign Function Interface

の話題が興味深かったです。断片的ですが、今後のヒントが得られたような気がします。

間違いはあると思いますが、何かの役に立つかもしれないので、メモを載せておきます。わからない英語は、そのまま書いてある所があります。意訳も入っています。

00:40 An alien Language
00:56 ICFP contest
      勝つのがとても難しい
01:23 Hard things made Easy
01:40 Infinite loops made Fast
01:58 研究者指向の言語
02:02 Haskellはいろんな実装がある
02:20 プロダクションユースではGHC
02:25 GHCi: インタラクティブ版
02:50 実際のHaskellのコードを見てみよう
03:03 WTF?
03:20 Variables never change
03:40 Perlの例
04:00 Haskellで同じような処理を書いた例
04:48 where
06:06 関数の入力が同じなら出力も同じ
07:45 readLnはactionで42はvalue
08:00 Monadは"Action"だと考えれば良い
08:50 balancedは対応の取れた括弧をパースする関数
10:00 do notationでactionのsequenceを表現する
     do notaionnはactionを改行して書けばセミコロンと{}を省略できる。
10:55 Parser Action
11:38 Lazy
      ignored, unused
12:17 Another example: 大きなファイルを読み込む
12:49 $
      Haskellプログラマーはlispプログラマーのように括弧を一杯使わない。
      代わりに$を使う
13:20 フィボナッチ数列
      list comprehension
14:00 @パターン
15:03 Types
17:00 Type Inference
      :t
      infix function
18:27 reverse
18:47 Currying
      Waiting a number
19:55 Higher Order Types
      map
21:36 Functions
      lamda
      case .. of
      pattern matching
23:58 Data Types
      Boolean
24:06 List
24:49 data [α] where
25:06 sum
25:49 Quicksort
      partition
27:09 Type Classes
28:00 Eq class
28:35 instance
29:05 deriving
29:23 Marshalling
      show
      read
30:27 Relations
      Compile class
31:27 More Actions
      Monad Transformersじゃなくて"Action Layers"と考えた方がわかりやすい
31:58 Monad Transformer
      文字列の入出力を行う関数があるとする(IO String)。
      その一方でログをどこかに残したいとする(Writer Log String)。
      そんな時はMonad Transformerを使うことで、文字列の入出力を行う
      一方でログを同時に残すことができる(WriterT Log IO String)。
32:15 様々なMonad Transformerがある。例えばContT、ExceptT、SearchT
      いかなるAction(モナド)は、Monad Transformerでレイヤーのように積み重ねることができる。

32:35 Unit Tests
      冗長だ
33:13 QuickCheck
      ライブラリー
      ユニットテストをプログラマーの代わりに書いてくれる。
33:25 テストに失敗するprop_sqrt関数
34:00 テストに成功するprop_sqrt関数
34:30 Arbitrary class
34:55 forAll

35:13 Parsec
      Perl6をパースするのは、これまでとても難しい問題の1つでした。5年もの間。
      私はそれをやりました。
35:24 Day One
      2時間15分使いました。
      2時間は論文を読むのに使いました。つまりドキュメンテーション。
      なぜなら、Haskellにはライブラリには、皆さんご存知のmanページがないから。
      あるのは論文。
36:16 buildExpressionParser
      operatorsとtermの定義を関数に渡すだけで良い。
36:28 Operatiors
      演算子をパースするのは簡単。
      Parsecの仕様書からコピー&ペーストして作りました。
36:43 Terms
37:20 15分後、Parsec付属のparseTest関数でうまくパースできることを確認しました。
      Abstract Syntax Treeが表示されました。
37:30 Abstract Syntax Tree
      これは1日目だからシンプル。今はもっと複雑。
38:00 パースができるようになって、それが実行できるようになるまで3時間でした。
      eval

38:28 Software Transactional Memory
      銀行の例
      Race Condition
      Lock
39:39 Perl6では{ is atomic; 処理 }のように書けばよい。
39:58 Haskellでは「atomically」関数がある
      Lock-free
      Race-free
40:26 Retry: STMを使って銀行の例をやり直す
      STM action
41:02 伝統的なlockを利用するスレッドモデルだとbusy waitが発生する。
      条件が満たされるまで何回も空回りするからCPU時間を食ってしまう。
      But in STM, it registers that it once it depends on the value of balance. 
      And it is only goes for when other thread touches this account.
      So there is no busy wait. It's very fast.
41:53 orElse
      伝統的なモデルだとgiant lockやgiant select loopを使わないと、こんなことはできない。
      Haskellだと非常に自然に記述できる。Perl6もそう。
42:05 CPUの能力に応じてリニアに(パフォーマンスが)スケールする。
42:13 It's an atomic power!

42:22 Haskell Server Pages
43:46 wxHaskell
44:24 他にはベクターグラフィックジェネレータのCairoなんかがある。
   それはフラクタルを生成する。でも詳しいことはよくわかっていません。

44:33 Foreign Function Interface
      Haskellのプログラムの中で、いかなるC言語のプログラムをインクルードできる。
45:20 #{def }の中にC言語のコードを埋め込むこともできる。
45:35 エクスポートもできる。
      Haskellのある関数を他の名前でエクスポートすることもできる。
      例えばvalToSv関数をpugs_ValToSv関数としてエクスポートできる。
   C言語では名前空間がサポートされていないから。
45:53 There is a lot of ways of combining things.
      Perl6ではAntiBuddhaやDrIFTなどの外部コンポーネントをFFIを通して利用している。

46:02 Cabal
      MakeMakerのようなもの。
46:48 hs-plugins
48:06 Visual Haskell
      BSDライセンス
      IDE
47:42 Power of Reason