京王線は調布駅地下線化切替え工事が朝にあったので、リスク回避のため長津田経由で田園都市線から半蔵門線直通の電車で神保町へ。
銀河アリーナで相模原チームのレースを観戦していた関係で時間的にぎりぎりだが、淵野辺公園のバス停に向う途中で目の前をバスが通りすぎていって、こりゃだめだなとおもいつつ歩いていたら、なかなか発車せず乗れてしまった。どうやらおばあさんが降車に手間取ってたみたい。
12時51分にIIJに到着。すでに人かげはない。とりあえずロビーでひるめしの惣菜パンをくってるとカズさんがやってきて、ロビーにいた5〜6人をひきあげてくれた。
- http://partake.in/events/b531758c-3fed-43fb-a71f-6edbc2cbb9b4
- 座席表: https://docs.google.com/spreadsheet/ccc?key=0AhOpxTG0jPHIdDlBV3hPNUJWVnB4Uy0wLVMzYkxoMUE#gid=0
- まとめ: http://togetter.com/li/358367
[2012-08-19 13:05]
第6章 モジュール / @aomoriringo
- http://www.slideshare.net/aomoriringo/haskell-6
- モジュールを調べる
- Hackage
- Hoogle (標準ライブラリだけ、ローカルインストールして育てればできる)
- Hayoo!(ハヨー?ハユー?)
[2012-08-19 13:39]
- import Foo () の使い道は?
- インスタンス宣言だけをインポートするときにつかう。(インスタンス宣言を読み込まない方法はない)
- Data.Char.chr はunicode
- Charをみたら4バイトとおもえ! (Cのcharとはちがう)
- Data.Word.word8がCのchar相当。
- Map.map: Mapはインファイトマップ(要素が重複しない辞書)? mapはファンクターのマップ. 独立な分野でたまたま同じ名前をつかっていたため。
- Map.Mapって書きたくないのでimportを複数回することがある。
- エクスポートリストは明示的に書いた方がghcが最適化してくれるかもしれない。
- すべてのファイルはmodule..から始める。
- Mainだけはファイル名と一致しなくてもよい。テスト用のMainと本番用のMainを別々に書ける。
- Haskellは省略するとMainモジュールになってMainだけがエクスポートされる。
- main.hsと書くことでモジュールと混同しないようにするテクもある。
- Q: importをいっぱいかくのはめんどくさい。yesodoなんかだとimportだけするモジュールがつかわれているが?
- A: これはありだが、におう。
- Q: パッケージ単位のアクセスコントロールはあるか?
- A: cabalファイルで制御できる? 外には抽象データ型にして、テストのときにはガシガシ触りたい。 ghcのオプションもある。作成者がコントロールできて、利用者はできない。
[2012-08-19 14:03]
第7章 型や型クラスを自分で作ろう / @a_hisame
- http://www.slideshare.net/a-hisame/start-haskell7
- let defaultPerson = Person { ... } としておいて、let newPerson = P { 変えたいところ }。 makePersonみたいなのをつくってもいいけど。
- Nothingには型引数はいらない。[]::aもおなじ。
- データに型制約をつけるのはHaskellでは推奨されず、関数につけるのが一般的。
- Either a b = Left a | Right b Rightに右と正しいの二重の意味があるが、モナドを勉強すると2番目にあるのが便利なのがわかるよ。Bool,Maybeも左が失敗・右が成功になっている。
- データコンストラクタも関数とおんなじで部分適用できる。関数は計算するがコンストラクタはデータをつくる。
- 記号だけの関数名は中置になるが、コロンではじまるデータコンストラクタが中置になる。
- 二分木に制約をつけて二分探索木にしようとすると、依存型になってagdaが必要になる? Haskellで「この関数は負整数しか返さない」という記述を簡単にする方法はない。
- Q: 探索関数に二分探索木じゃないのをわたしたときはどうする?
- A: API的に正しい二分探索木しか生成しないなら、チェックする必要はない。
- こぼればなし: Data.Mapにdeleteのときにバランスがくずれるバグが10年くらいきづかれなかった。
- instance Functor (Either a) where... をみて右が正しい値でよかったなぁとおもえると型クラスを理解したといえる。
- ホワイトボード:
- Q: コンパイルはエラーにならなくて実行時にセレクターがみつからないとでる。
- A: 関数にしたらパターンをつくしてないとエラーになるので今のHaskellだと安全かも。
[2012-08-19 15:24]
[2012-08-19 15:50]
演習
[2012-08-19 16:09]
LT: 再帰の鳥瞰図 / @kazu_yamamoto
- http://mew.org/~kazu/material/2012-recursion.pdf
- 末尾再帰 vs 一般的な再帰(いいなまえ募集中)
- 末尾再帰 <==> ループ
- 関数型言語なら一般的な再帰でより強い力をつかうべき。スタックを消費する分、いろんなことができる。
- 面接に出る一般的な再帰 (エンジニアが面接にでてくるようなまとまな会社)
- コインの両替問題
- 二分木のパターン数(カタラン数)
- 強い←再帰、畳み込み(foldl,foldr)、単純な高階関数(map,filter)→弱い
- なるべく弱いものをつかうとバグがはいりにくい。
[2012-08-19 16:23]
演習
- https://github.com/yuzutechnology/Community-StartHaskell2011/tree/master/exercises/recursion
- http://wiki.haskell.jp/Workshop/StartHaskell/recursion
- おすすめ?: https://github.com/yuzutechnology/Community-StartHaskell2011/blob/master/homework/homework02/Homework02-ja.md
[2012-08-19 17:47]
質問コーナー
- http://wiki.livedoor.jp/igrep/d/Haskeller%a4%cb%ca%b9%a4%a4%a4%c6%a4%df%a4%e8%a4%a6
- http://wiki.haskell.jp/Workshop/StartHaskell2/FAQ
- おすすめの正規表現?
- Perl的(非決定的)、Posix的(決定的)のどっち?
- Perl→pcre(Macではむつかしいかも), Posix→すでにある。
- つかいかたがわからない。すごすぎてわからない。返す型が多相なのでむつかしい。
- 関数の名前
- 簡単なのは推論にまかせる。
- 難しいのはシグニチャだけ書いて設計する。
- cabal installしたパッケージ
- cabalの挙動が最近かわった。以前は許可なく上書きインストールされてた。ソルバーがかしこくなったので、問題おきにくくなったはず。
- cabal checkでこわれてないかしらべるといい。
- cabコマンドもある。
- (モジュールの)ドキュメントをサクっと読むツール
- 環境依存なので。emacsならその関数のところでポチっと。
おわり。会場からの質問がちょっと少なかった印象。