PARTAKE
http://partake.in/events/b531758c-3fed-43fb-a71f-6edbc2cbb9b4
以下の書籍をテキストとした、セミナー形式と演習形式を組み合わせた勉強会なのです。
![]() | すごいHaskellたのしく学ぼう! (2012/05/23) Miran Lipovača 商品詳細を見る |
夏休みで11日(土)から大阪の実家に帰省してたんですが、今日の朝、新大阪駅発の新幹線で東京に戻ってきて、そのまま直行です。
あ、ちなみに私、新幹線は必ず窓側の席を取るようにして、ずっと外眺めてます。
夏の日差しの中、いろんな町の風景を新幹線の中から眺めていると、すごく旅してる気分になれるのです。
窓側の席に空席が無い場合は、出発時刻を多少遅らせてでも窓側を取ります。
でも、長距離移動後に長時間の勉強会は、さすがに疲れました。。。 荷物は重いし、座りすぎでマジ肩凝ったわ~
---
さて、今日は第6章と第7章が対象範囲です。
前半2時間がセミナー形式で上記2章分の発表、そして約20分の休憩後、約2時間半の演習+LT発表がありました。
● 第6章「モジュール」
第6章「モジュール」の発表の担当は @aomoriringo さんです。
@aomoriringo さんとは、別の勉強会で一度会話したことあったはず。。。多分。
たしかそんときは、ルービックキューブの会話をした覚えがあるんだけど、違ったかな。。。?
自分への覚書のため、6章で気になったフレーズを羅列してみます。
■ :m - でインポートを解除できる。(例: ghci> :m - Data.List)
■ Haskellのモジュールを調べるのに、Hayoo!というものがある。
(HackageとHoogleは知ってたが、Hayoo!は知らなかった。検索エンジンのGoogleとYahooを意識したネーミングですね。。。)
■ Hoogleは標準モジュールだけ検索できる。Hayoo!だと標準モジュール以外も検索できる。
■ C言語とかだとcharは1バイトだが、HaskellのCharはUnicodeなので4バイトらしい。
■ import Foo () みたいな書き方はインスタンス宣言だけをimportするときに使う。
■ foldl'でも第一引数の関数が遅延評価するとき、スタックオーバーフローとなることがある。
■ module構文でエクスポートする関数を明記することが推奨されている。なぜなら、GHCが最適化して速くなることがあるから。
■ 複数のMainが定義できるように、Mainモジュールのみファイル名と一致しなくてもよい。
モジュール名を省略した場合はMainモジュールと見なされる。
■ import文が多いコードは、1モジュールに機能を詰め込みすぎな臭いがする。分割してimport文を減らすのが良い。
● 第7章「型や型クラスを自分で作ろう」
次の第7章「型や型クラスを自分で作ろう」の発表担当は @a_hisame さんです。
@a_hisameさんは前回のTaPL読書会終了後の飲みで、向かいの席でした。
そのときの会話で、出身大学がお互い近くであることがわかったこともあり、親近感がありますね。
今日の発表は図を駆使して、わかりやすく説明しようという姿勢が随所に見られ、とてもわかりやすかったです。
@a_hisameさん曰く、「型って癒されますね!」
from a-hisame
自分への覚書のため、7章で気になったフレーズを羅列してみます。
■ 型引数Eitherで、Rightは「右」と「正しい」の両方の意味を兼ねている。
モナドを学ぶと、この定義が上手くできていることが良くわかる。
■ Bool, Maybe, Eitherは、左が「間違い」で右が「正しい」という定義になっている。
・data Bool = False | True deriving (Ord)
・data Maybe a = Nothing | Just a
・data Either a b = Left a | Right b deriving (Eq, Ord, Read, Show)
前半2時間の発表が終わり、20分の休憩後は演習&LTの時間です。
● LTその1 「再帰の俯瞰図」
最初のLTは @kazu_yamamoto さんの「再帰の俯瞰図」です。

↑ クリックすると発表資料(PDF)に飛びます ↑
自分への覚書のため、このLTで気になったフレーズを羅列してみます。
■ 再帰には「末尾再帰」と「一般的な再帰」の2種類がある。
■ 末尾再帰の場合、= のすぐ右に自分自身の関数が来る。(例:gcd a b = gcd b (a ‘mod‘ b))
■ 末尾再帰はループと同じ力を持つ。(ループで書けるものは末尾再帰で書ける)
■ ループはスタックを消費しないので、末尾再帰もスタックを消費しない。
■ ループで書けるようなコードなのに一般的な再帰になっている場合は、引数を増やすことで末尾再帰にできる。
■ 一つ前ができたとしたら次はどうする?と考えることが再帰のポイント。
■ 面接に出る一般的な再帰!
・コインの両替問題
・二分木のパターン数 (カタラン数)
→ 両方とも知らなかったので、この機会に調べておこう。。。
■ なるべく力の弱いものを使うべき。 (↓の力関係がある。右ほど弱い)
再帰 > 畳み込み(foldr/foldl) > 単純な高階関数(map/filter)
● LTその2 「Haskell 学習者の FAQ」
もう一つのLTは @igrep さんです。
@igrep さんがが壇上でHaskellに関する質問を発表し、それを上級Haskellerに答えていただく、という企画で、
名づけて「Haskell 学習者の FAQ」です。
こちら → http://wiki.haskell.jp/Workshop/StartHaskell2/FAQ
LTの結果を踏まえ、上記に正規表現ライブラリやCabalに関する質問と、@kazu_yamamoto さんによる回答が纏められています。
---
LTの他に、今回は演習問題を解く時間が2時間ほど確保されました。
● 演習問題
1. 前述の、@a_hisame さんの7章の発表スライドP.46から「木の最大の深さを求める関数の実装」
2. 初代「スタートHaskell」の演習「再帰の練習問題」
https://github.com/yuzutechnology/Community-StartHaskell2011/blob/master/exercises/recursion/recursion-ja.lhs
3.リストの要素で、自身と自身のひとつ前の要素が与えられた条件を満たすものだけを 返す関数の実装(問題2)
https://github.com/yuzutechnology/Community-StartHaskell2011/blob/master/homework/homework02/Homework02-ja.md
---
1.は、すんなり解けませんでした。解答を見ると、あぁなるほどなぁー、と思うんですが、パッと実装できない。。。
2.は、前回のLTの文芸的プログラミングを使用したTDDベースの演習問題です。私は、12個か13個くらいの問題をといたところでタイムアップとなりました。
3.は、演習時間内にやれる余裕がなかったので、時間があれば今度見ておこう。
---
今日の勉強会も大変有意義でした。
主催者さん、運営者さん、いつもありがとうございます。
次回も楽しみにしてますー
当日のツイートまとめです。