静岡Developers勉強会 第5回Haskell読書会に参加しました。
静岡Developers勉強会 第5回Haskell読書会に参加した皆さんお疲れ様でした。発表者のふるたさんも、お疲れ様でした。reverse関数の定義で用いたトランプの例えが、関数の動作をイメージしやすかったと思います。
講義録について
今回は勉強会に参加しながら復習した部分を中心に載せていきます。なお、見出しの番号はテキストの通し番号に揃えてあります。
2.4 Haskellプログラム
- レイアウト規則
- whereを使ってレイアウト規則を使う場合、where節を用いる定義よりも一文字インデントを下げる。
a = b + c where a = 1 b = 2
3.8 多重化型定義
- クラス制約
- C a
- 「C」はクラス名
- 「a」は型変数
6.6 再帰の秘訣
ここが、今回の勉強会の「肝」だったと感じています。
その他
- リストのインデックスは0から始まる。
- 簡約とは、関数を適用することで、これ以上簡単な式にできない形へ変換すること。
- これ以上、関数を適用できない状態のこと
静岡Developers勉強会 第4回Haskell読書会に参加しました。
静岡Developers勉強会 第4回Haskell読書会に参加した皆さんお疲れ様でした。
講義録について
前の生成器の値を、後の生成器の値として利用できる
Hugs> [ (x, y) | x <- [1..3], y <- [x..3]] [(1,1),(1,2),(1,3),(2,2),(2,3),(3,3)]
なるほど。
問. 2つのサイコロの出目の組み合わせの数を、リスト内容を使って求めよ。
Hugs> length [(x,y)| x<- [1..6],y<- [1..6]] 36
問.組のリストから各組の2番目の要素を取り出すsecondsを定義せよ。
seconds :: [(a,b)] -> [b] seconds ps = [ y | ( _ , y ) <- ps]
Main> seconds [(2,3),(3,3),(4,2)]
[3,3,2]
ワイルドカードを使って、捨て変数を使うという考え方がHaskellらしい考え方ですね。
練習問題
問1.
sumOne2Hundred = sum [ x*x | x <- [1..100]]
問2.
ここでもワイルドカードを使い、n回繰り返すのは[1..n]の値を捨てるという考えに基づく。
「ワイルドカードのn個の値に持つリストに、xを代入するという考え」。
myreplicate :: Int -> a -> [a] myreplicate n x = [x | _ <- [1..n]]
yを捨て変数として計算する方法もある。ただし、変数を何も使用しないとエラーが出ることがある。
myreplicate :: Int -> a -> [a] myreplicate n x = [x | y <- [1..n]]
無限のリストを生成し、takeで必要な分だけ取る方法もある。
myreplicate2 :: Int -> a -> [a] myreplicate2 n x = take n (repeat x)
今後、使う約数を求める関数factorsを定義する。
factors :: Int -> [Int] factors n = [x| x <- [1..n], n `mod` x == 0]
関数factorsを用いて、整数が素数か否かを判定する関数primeを定義する。
prime :: Int -> [Int] prime n = factors n == [1,n]
この関数primeを用いて2つの場合を計算する。
Main> prime 2147483646 False
2の倍数なので、factorsが[1,2,]を返した時点で、遅延評価で値が返る。
Main> prime 2147483647 ^C{Interrupted!}
値は返ってこない。いつまでたっても返ってこない。
ガードの話
ガードがTrueの場合のみ、値をリストに追加する。
ある値までの素数を返す関数primesを定義する。ここでは、関数primeをガードとして利用している。
primes :: Int -> [Int] primes n = [ x | x <- [2..n], prime x]
Main> primes 1 #処理系が空リストを返す [] Main> primes 2 [2] Main> primes 3 [2,3] Main> primes 4 [2,3] Main> primes 5 [2,3,5]
ハッシュのような使い方ができる関数findを定義する
find ::Eq a => a -> [(a,b)] -> [b] find k t = [v | (k',v) <- t, k == k']
Main> find '2' [('2',5),('1',3),('2',1),('3',4)] [5,1]
リストの隣の値との組を生成する関数pairsを定義する。
pairs :: [a] -> [(a,a)] pairs xs = zip xs ( tail xs )
Main> pairs [1,2,3,4] [(1,2),(2,3),(3,4)]
あるキーがリストのどの位置にあるかを出力する関数positionsは次のとおり。
positions :: Eq a => a -> [a] -> [Int] positions x xs = [i | (x',i) <- zip xs [0..n], x == x'] where n = length xs - 1
Main> positions False [True,False,True,False] [1,3]
練習問題その2
問3.
pyths :: Int -> [(Int,Int,Int)] pyths n = [(x,y,z)| x <- [1..n],y <- [1..n], z <- [1..n],x^2 + y^2 == z^2]
Main> pyths 10 [(3,4,5),(4,3,5),(6,8,10),(8,6,10)]
問4.
factors :: Int -> [Int] factors n = [x | x <- [1..n], n`mod`x == 0] perfects :: Int -> [Int] perfects n = [x | x <- [1..n], sum (init (factors x)) == x]
問5.
concat2 = concat[[(x,y) | y <- [4,5,6]] |x <- [1,2,3]]
外側のxから評価しているのでいいのかな?
問6.
find :: Eq a => a -> [(a,b)] -> [b] find k t = [v | (k', v) <- t, k == k'] positions :: Eq a => a -> [a] -> [Int] positions x xs = find x (zip xs [0..n]) where n = length xs - 1
問7.
scalarproduct :: [Int] -> [Int] -> Int scalarproduct xs ys = sum [x*y |(x,y) <- zip xs ys]
今後について
次回の静岡Developers勉強会 第5回Haskell読書会は静岡で開催。Ustreamして、webから見てもらうのはいかがでしょう?
遠い先の話ですが、「Haskell読書会が終わった後、何をするか。」と帰りの電車の中でやじゅさんと話していました。
個人的にはアルゴリズムの本を読みたいのですが、Erlangなど別の関数型言語を学ぶのもいいですね。でも、一番よいのは、こういった「集まる場所」があるということで、今日は落ち着きました。
オマケ
今週は写真が保存されていなかったため、おやすみ。
静岡Developers勉強会 第3回Haskell読書会に参加しました。
静岡Developers勉強会 第3回Haskell読書会に参加した皆さんお疲れ様でした。
講師として発表
今日は私が講師として発表者しました。久しぶりの発表で、Mac&Keynoteを使ったセッティング等、トラブルもありましたが、無事に発表することができました。発表資料を、以下のとおりslideshareにupしたのでご参考にしてもらえると幸いです。
参考図書使用のお薦め
使用図書は、後の章まで進んだ際に「なるほど」と理解できる場合が多いので、少しぐらい分からなくても「後で分かる!」と思って進みましょう。第4章はその印象が強い章でした。*1
また、原著が英語であり、訳書であるためなのか、使用図書は理解が難しい表現がある*2ため、参考図書を購入して、並行して読み進める方がよろしいかと思います。ちなみに私はこの本を使いました。
ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門
- 作者: 青木峰郎,山下伸夫
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2006/06/01
- メディア: 単行本
- 購入: 25人 クリック: 314回
- この商品を含むブログ (320件) を見る
講義録について
発表していて印象に残ったコメントを残しておきます。
sourceを当たりたいときはこちらを閲覧します。
λ式を使うと確かに名前を定義する必要はなくなるが可読性は落ちる
そのとおりだと思います。使い分けが大事ですね。
この2つの説明があって、セクションの節の意味が分かりました。
- 英語の原本を読むとよい。
この本は大学の講義向けですね。ちなみに、著者のサイトはこちら。
LTについて
Supakiyさん、初めてのLTお疲れ様でした。私が思うtwitterの魅力は、「その人の生の声が直接リアルタイムで聞けること」だと思います。ぜひ、LTの感想をblogに書いてほしいです。
ちなみに、私もこっそりLT用資料を用意していたので、せっかくだから貼りつけておきますね。
今後について
次回の静岡Developers勉強会 第4回Haskell読書会は三島で開催!
また、横浜でもふつうのHaskellプログラミング読書会があるそうなので、「ぜひustしてもらいたい!」と思ってます。
第2回静岡Developers勉強会 Haskell読書会に参加しました。
第二回Haskell読書会開催のお知らせ - 静岡Developer's 勉強会に参加した皆さんお疲れ様でした。
今日の講義で私が取ったメモとそれに対するコメントを残しておきますので、ご参考にしてもらえると幸いです。
*1
処理系によってCharのリストとして認識する場合もあるんですね。
StringはCharのリスト
へぇー。
- 固定精度整数Int
- 32bitで表現できるのは-2^31<= x < 2^31
Charのリストを要素に持つリストになるんですね。教科書と違うなぁ。
こちらも、Charのリストを要素に持つリストになります。
Hugsでは要素になるとCharのリストになるらしいです。
- クラス制約をする多重定義型の例
- Hugs> :type (1,[2,3],[4,5,6],7)
- (1,[2,3],[4,5,6],7) :: (Num a, Num b, Num c, Num d) => (d,[c],[b],a)
第3章の代表例のようなものですね。
--無限のリストを作成するhaskellプログラム myadd :: Int -> ( Int -> Int) myadd x y = x + y unlimlist :: Int -> [Int] unlimlist n = n:(unlimlist (myadd n 1))
terminalがすごいことになりますね。
- :(コロン)の演算子は「リストの先頭に要素を追加する」
- Main> 1:[2,3]
- [1,2,3]
なるほど。
- ¬(否定演算子)はnotで書く
- Main> :type not
- not :: Bool -> Bool
ここ、聞きたかったんです。巻末の付録Bに記載がありましたね。
- 関数とは
- 「1つの引数の型をもらって、一つの型を返す」のが関数の定義です。
- 途中で引数を一つとった内部的な関数が生成されている。
- myadd x y = x + yを考えると、((myadd x) y)というイメージ
- (myadd x)は一つの引数を取る関数であるため、yを引数として取る。
-letはhugsでは使えない>
*1:講義の中でも出ましたが、議事録を次回の読書会の前に読み返すと、意味がよく理解できるようになっているのに気づきました。
静岡Developers勉強会 Haskell読書会に参加しました。
静岡にて初ITコミュニティ活動へ参加
本日、2010年1月16日(金)にshizuoka_developer_haskellに参加してきました。静岡に来てから初めてITコミュニティに参加することもあり、わくわくしながら会場へ5分前に到着し、席を確保。Ubuntuを入れている方もいたりと、流石、IT系のイベントとワクワクしていました!
参加メンバー
今回の参加者は13名。三島、浜松、と馴染みのある土地から来た方、東京という遠方からいらっしゃった方もいました。驚いたことに、今回は、16才の高校生も参加していました。自分でCentOSサーバー組んで、ドメインも取得しているとのこと。素晴らしい!*1
「Haskell書けます」って言いたい!
本物のプログラマはHaskellを使う | 日経 xTECH(クロステック)にもありますが、「本物のプログラマはHaskellを使う」そうです。「Haskell書けます!」って言えるようになるために勉強するんですね、分かります。というのは冗談で、あまり馴染みのない関数型言語について理解を深めて、今後の業務に活かすのが目的です。
講義の進行について
講義は下記の書籍を担当者がスライドを使って説明し、巻末の練習問題を解く形式で進められました。
- 作者: Graham Hutton,山本和彦
- 出版社/メーカー: オーム社
- 発売日: 2009/11/11
- メディア: 単行本(ソフトカバー)
- 購入: 14人 クリック: 503回
- この商品を含むブログ (117件) を見る
講義メモとコメント
発表のスライドはまた別の手段で公開してくださると思うので、今日の講義で私が取ったメモとそれに対するコメントを残しておきます。
遅延評価とは、必要になった段階で計算することです。このため、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
また、参照透過性とは、次のように定義されています。
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。再起再帰させることが本質ならHakell。
- Dr.Erik Meijer
- Microsoftのコンピュータサイエンティスト
C9 Lectures | Tags | Channel 9でHaskellの講義の映像を公開しています。
- !
- エクスクラメーションマーク
- !!
- ダブルエクスクラメーションマーク
- dx(笑)
確かに、数学系の人がいたら、どつかれましたね。
- :edit filename
- filenameを標準エディタで編集する。
- :reload
- 現在のファイルを再読み込み
- :type expr
- expr の型を表示する
editで編集してreloadするやり方もありですね。
- リストの要素は全て同じ型でないとダメ
うっす。
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アプリケーション開発したよ」「興味のある論文を実装したよ」なんかやりたいですが、これは、また別の機会に。
emacs読み込み専用モードを解除する方法
emacs が起動したら最初から読み込みモードになっている。
これから、勉強会に参加するのにエディタが使えないなんて困る!ということで、http://www.bookshelf.jp/soft/meadow_13.htmlより解除方法を拝借。
読み込み専用を解除するには,モードラインにある「%%」を左クリックするか, C-x C-q や M-x toggle-read-only を利用します.
とのこと。%%をクリックして無事解除。
Ruby技術者認定試験(Silver)に合格して分かったこと 〜脳をインタプリタとして動作させる〜
まずは結果から
2010年1月15日(金)にRuby技術者認定試験(Ruby Association Certified Ruby Programmer Silver)に合格しました。
試験時間は90分ありますが、約40分で全50問回答完了しました。82点*1と大手を振って言える点数ではないですが、それでも、頑張った自分へのご褒美のために報告です。
出題内容について
id:nobyuさんのhttp://d.hatena.ne.jp/nobyu/20090724/1248442523が大変良くまとまっています。勉強法や出題傾向については、記事に書いてあるとおりです。助かりました。
試験を通じて習得できるスキル
RubyにおけるStringクラス、Arrayクラス、Hashクラスのメソッドに明るくなります。*2例えば次のようなStringクラスのchopメソッドとchompメソッドの違い等です。
# chopは文字列の末尾の1文字を取り除く。ただし、末尾が"\r\n"の場合は2文字取り除く。 p "hogehoge\r\n".chop.chop # => "hogehog" # chompは文字列の末尾から行区切りのみを取り除く。 p "hogehoge\r\n".chomp # => "hogehoge" # メソッドチェーン p "hogehoge\r\n".chop.chop.chomp # => "hogehog"
試験勉強方法
id:nobyuさんや同試験に合格した大学時代の同期に倣い、私も次の書籍を購入して試験に備えました。
RUBY技術者認定試験 公式ガイド (ITpro BOOKs)
- 作者: 伊藤忠テクノソリューションズ,Rubyアソシエーション,ITpro
- 出版社/メーカー: 日経BP社
- 発売日: 2009/03/25
- メディア: 単行本
- 購入: 49人 クリック: 595回
- この商品を含むブログ (43件) を見る
この書籍を使った勉強法は次のとおりです。
- 巻末の模擬試験を解く。
- 正解した問題も間違えた問題も解答を読む。
- 問題毎に、ノートへ、クラスやメソッドの概要をまとめる。
- irbで問題文のコードや自分で考えたコードを実行し、動作を確かめる。
- 書籍で分からない内容(ex. メソッド等)が出たら、プログラミング言語 Ruby リファレンスマニュアルやhttp://www.namaraii.com/rubytips/を読む。
- やっぱりirbで動作を確かめる。
- 再度、模擬問題を解き直し、コードの意味を口ずさめるようにする。
インタプリタとしての脳
今回の試験を通じて、プログラミングの習得で必要だと思ったことを列挙すると次の3つになります。
これまでも、「はじめてのRuby」を上記の勉強法を使って習得していました。
- 作者: Yugui
- 出版社/メーカー: オライリージャパン
- 発売日: 2008/06/26
- メディア: 大型本
- 購入: 27人 クリック: 644回
- この商品を含むブログ (251件) を見る