静岡Developers勉強会 Haskell読書会に参加しました。

静岡にて初ITコミュニティ活動へ参加

本日、2010年1月16日(金)にshizuoka_developer_haskellに参加してきました。静岡に来てから初めてITコミュニティに参加することもあり、わくわくしながら会場へ5分前に到着し、席を確保。Ubuntuを入れている方もいたりと、流石、IT系のイベントとワクワクしていました!

静岡Developers勉強会 開始前

参加メンバー

今回の参加者は13名。三島、浜松、と馴染みのある土地から来た方、東京という遠方からいらっしゃった方もいました。驚いたことに、今回は、16才の高校生も参加していました。自分でCentOSサーバー組んで、ドメインも取得しているとのこと。素晴らしい!*1

Haskell書けます」って言いたい!

本物のプログラマはHaskellを使う | 日経 xTECH(クロステック)にもありますが、「本物のプログラマHaskellを使う」そうです。「Haskell書けます!」って言えるようになるために勉強するんですね、分かります。というのは冗談で、あまり馴染みのない関数型言語について理解を深めて、今後の業務に活かすのが目的です。

講義の進行について

講義は下記の書籍を担当者がスライドを使って説明し、巻末の練習問題を解く形式で進められました。

プログラミングHaskell

プログラミングHaskell

書籍を用いて、やじゅさんが第1章、第2章を担当し、講義を行ってくださいました。

講義中
小ネタも仕込まれて笑いをさそいつつ、分かりやすい説明でした。ありがとうございました。

講義メモとコメント

発表のスライドはまた別の手段で公開してくださると思うので、今日の講義で私が取ったメモとそれに対するコメントを残しておきます。

  • double(double 2)
    • 「内側のdoubleを適用する方法」と「外側のdoubleを適用する方法」がある
      • 内側のdoubleを先にするのがjava
    • 外側のdoubleを適用すると、計算上、2工程多く必要になる
      • 遅延評価はこちらの方法がよく、Haskellはこちらを採用

遅延評価とは、必要になった段階で計算することです。このため、Haskellでは、無限のリストも評価をしない限り計算可能なので無限のリストも扱うことができるます。

  • 純粋型関数
    • 純粋とは副作用がないこと。参照透過性のおかげで保守性が高い。
  • 再代入(破壊的代入)は許されない
    • ex. a = a + 1
      • i.e. a = 1の後にa = 2 は不可*2

ちなみ、副作用とは次のように言い換えられるようです。

副作用(side effect)というのは、メッセージの表示や、変数への代入といった、状態が変化する作用のことを言うんだ。

http://www41.atwiki.jp/knenethaskell/pages/22.html

http://www.codelogy.org/archives/2007/07/haskell_1_1.htmlやその続編記事によると、HaskellにもIO制御という副作用があるが、それを見えなく(無視する)ように抽象化しているようです。*3

また、参照透過性とは、次のように定義されています。

  1. 同じ条件を与えれば必ず同じ結果が得られる
  2. 他のいかなる機能の結果にも影響を与えない
http://ja.wikipedia.org/wiki/%E5%89%AF%E4%BD%9C%E7%94%A8_%28%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%29

Haskellでは、「関数が一度決まると値は一意に決まる」のがHaskellの特徴です。しかし、

  • 変数はない?
    • 局所的変数はある。

上記と矛盾するようですが、第6回 局所的な「状態」を利用するためのStateモナド | 日経 xTECH(クロステック)によると、局所的変数を実装するためにモナドを使っているそうです。*4

  • SQLも問い合わせ言語

SQLが分かると、他の問合せ言語が分かります。素晴らしい。

  • 関数ごとに並列演算ができる(i.e. マルチCPUを積んでいる現在の計算機のトレンドに合っている。)
  • 今後は並列化プログラミングが重要(cf. CPUの並列化)
    • Map
      • 与えられたリストを別のリストに変換。入力はリスト。出力もリスト。
  • Reduce関数
    • 入力は関数、値、リスト。出力は値。

並列演算が出来るのもHaskellの特徴だそうです。

  • Tac関数(たらい回し関数)を書くことができる。

Haskellは相当速いらしいです。(cf. 404 Blog Not Found:たらいを回すならHaskell)

  • length関数
    • リストの要素数を返す関数

例えば、「リストの中身が0で割っていてエラーを吐く」場合、リストの長さを計算する際、javaの場合は中のリストを計算しエラーを出力するが、Haskellではリストの中身は遅延評価なので、要素数は計算してくれます。

  • 型推論はある
    • 基本は型推論をしてくれるけど、空気読まないとエラーを吐く
    • ちゃんと型宣言しておくと、意図通りに組まないと絶対に動かない

「引数」「戻り値」「関数」の型を決めましょう。意図通りの動作をしてくれるはずです。

  • Haskellの妙技
    • リストが空になった時点で再起再帰が止まる
  • 単位元は加法は0。乗法は1。

「何をさせるか」に注目しているのがHaskell再起再帰させることが本質ならHakell。

  • Dr.Erik Meijer
    • Microsoftのコンピュータサイエンティスト

C9 Lectures | Tags | Channel 9Haskellの講義の映像を公開しています。

  • !
    • エクスクラメーションマーク
  • !!
    • ダブルエクスクラメーションマーク
    • dx(笑)

確かに、数学系の人がいたら、どつかれましたね。

  • :edit filename
    • filenameを標準エディタで編集する。
  • :reload
    • 現在のファイルを再読み込み
  • :type expr
    • expr の型を表示する

editで編集してreloadするやり方もありですね。

  • リストの要素は全て同じ型でないとダメ

うっす。

  • 命名規則
    • 新しく関数名を定義する場合、キャメル方式(Haskell)先頭が小文字*5
    • ファイル名は特に命名規則はない。
    • 引数がリストの場合、名前の最後にsを付け、複数の値を表現することを示す慣習がある。
      • ns:数値のリスト
      • xs:任意の値のリスト
      • css:文字のリストのリスト

xsがリストを意味するとわからなくて、最初は手間取りました。

  • 演習問題1
    • 問1
      • 計算順序を考えるという問題。問題文の意味がわからん。
    • 問2
      • 証明問題。
    • 問3
      • Haskellのコードを書きましょう。
    • 問4
      • できてないよできたよ
    • 問5
      • できてないよできたよ
  • 演習問題2
    • 問1
      • 問題なし
    • 問2
      • 階乗の定義が楽すぎる。素晴らしい。
    • 問3
      • 小文字、バッククオート、インデント
    • 問4
      • 出来たよ
    • 問5
      • できてないよ

訳者のwebサイトはプログラミングHaskell、著者のwebサイトはPage Redirection。解答も著者のwebサイトにあります。

  • ~は「ニョロ」じゃなくて「チルダ」だよ。

ニョロって呼んでました(笑)気をつけます。

2次会について

初回なので大人しめに参加させてもらいました。ただ、皆さん、開発に関わっている方は、知識が豊富でした。私も負けていられないので、次回は語れる話題を用意しなければ!

今後について

予算が余っていれば課題図書を一冊予備として買う案も賛成です。新規参加者の方も来やすいですし、もし参加し忘れてしまった人も、遅れずについていけますしね。次回は2010年2月27日(土) 13:00に第3章をたかはしさんが発表です。乗り遅れずに頑張ります。
個人的には、「rubyによるwebアプリケーション開発したよ」「興味のある論文を実装したよ」なんかやりたいですが、これは、また別の機会に。

オマケ

おやつ美味かったです。


おやつタイム

*1:私も見習わなければ。

*2:a=1に縛られるということ。

*3:現時点の調査はここまでとします。

*4:こちらも、今後の勉強会に期待。

*5:パスカル方式は先頭が大文字