スタートHaskell2 #2 に参加してきました
納期: 7日遅れ
第2回目スタートHaskell2 に参加してきました。
そう、それは1週間前の話です。可成り遅れたレポートと相成りました。
聞いてきた事
- 第3章: @mizu__tama さん
- 第4章: @ko1kun さん
- 第5章: @S1E11 さん
- 文芸的プログラミングについて: @shokos さん
- id のナゾ、const のヒミツ: @kazu_yamamoto さん
くわしく
- 第3章
- xs ++ ys は「パターン」ではなく「関数」。従ってパターンマッチできない。
- 「パターン」はHaskell により定義されている。それによって定義された物以外はパターンマッチの対象外。
- '_' から変数名を始めても良い。
- 例えば、"_garbage" や"_foo" など
- '_' を単体で使った時と同様に、その中身は捨てられてしまう。
- 明示的に、「この値はこうした理由で使われませんよ」と表したい場合に使う。
- とは言ったものの、あまり使われないらしいです。
- otherwise は変数であり、True と定義されている。
- Bool 値だから、ガードの判定式として扱える。True なので常に引っかかる。
- where 節に関数を書く場合は、型定義はあまり書かない。
- なぜか: 大体の場合、型推論が効くから。
- でも、where の中に型シグネチャを書くことも出来る。
- where の直後に(同一行に)where の内容を書くかどうかは好みの問題。でも、改行した方が良いんじゃないですか?
- let 式はその名の通り「式」
- let とlet in の違いとは
- リスト内包表記の中にlet を記述する場合はin は必要無い。(シンタックスシュガー)
- GHCi を起動するとIO モナドのdo の中にいる事になる。つまりリスト内包表記の中にいるのと同義。
- だからGHCi の中ではlet にin を付けなくても書ける!
- 式と式の関係性がない、つまり列挙しているようなスタイルの場合はin を書かなくても良い、という認識。
- でも、初心者は「let が来たらin が来る」という認識で良いんじゃないの、とのこと。
- let よりもwhere で書いた方が良い。その方が宣言的だから。
- case 式はその名の通り「式」
- case 式は書かない方が良い。関数のトップレベルで分岐させるべき。
- 実は、if はcase のシンタックスシュガー
- 分岐について詳しくは -> Haskellの文法(分岐編) - あどけない話
- xs ++ ys は「パターン」ではなく「関数」。従ってパターンマッチできない。
- 第4章
- 第5章
- foldl とfoldr はどちらを使うべきか
- リストを引数にとって、リストを結果として返すときはfoldr を使うべき
- 数値に畳み込みを行うような時はfoldl' を使うと良い
- 遅延評価しないから、良く分からない計算が膨れあがらない。無駄にヒープ領域を使わない。
- 基本的にfoldl は要らない子。foldr とfoldl' があれば大体何とかなる。
- 式に括弧が沢山付いている場合の処理
- 一番外側の括弧から先に外しましょう。
- 一番右の閉じ丸括弧を消して、それに対応する開き丸括弧を$ に置換する。それを順に行っていく。
- 一番右の$ 以外は. に置換することが出来るので置換する。
- 見やすい!!!!
- これを使って、かつポイントフリースタイルを用いると、関数合成によって関数を書ける(!)
- 詳しくはこちら 関数合成の妙技 - あどけない話
- 一番外側の括弧から先に外しましょう。
- foldl とfoldr はどちらを使うべきか
- その他
感想
だんだんと面白い事になってきやがった!!!!!!- 作者: Miran Lipovača,田中英行,村主崇行
- 出版社/メーカー: オーム社
- 発売日: 2012/05/23
- メディア: 単行本(ソフトカバー)
- 購入: 25人 クリック: 580回
- この商品を含むブログ (46件) を見る
僕が考えた演習問題の回答
1.論理演算
2.うるう年
3.FizzBuzz
4.caseとifを使わない
5.シーザー暗号
で、"Par Yngvmbhgte Ikhzktffbgz Ftmmxkl" は何を暗号化しているかというとghci> caesar 7 "Par Yngvmbhgte Ikhzktffbgz Ftmmxkl" "Why Functional Programming Matters"という感じでした。
6.パターンマッチの網羅
1.リストの長さ
2.総和と総積
3.偶数と奇数にわける
4.等比数列
1.部分適用された関数の型
max 5 :: (Num a, Ord a) => a -> a takeWhile (<100) :: (Num a, Ord a) => [a] -> [a] zipWith (+) :: Num a => [a] -> [a] -> [a]
2.コラッツ数列
コラッツ数列自体を求める関数collatz と、1..100 まででコラッツ数列が最も長いものを求める関数longestLengthOfCollatz
恐らく、答えは97 なのではないかと思います。
3.関数適用と関数合成
関数適用関数合成
4.ポイントフリースタイル
j をポイントフリースタイルで書き換えるってどうやってやるんですかね……5.applyTwice
applyTwice applyTwice (+1) 0 ->4 applyTwice applyTwice applyTwice (+1) 0 ->16 applyTwice applyTwice applyTwice applyTwice (+1) 0 ->65536かような結果が得られる理由:左結合だから?
applyTwice applyTwice applyTwice applyTwice applyTwice (+1) 0 の結果:2^65536