2010-07-01から1ヶ月間の記事一覧
9.4 型クラス オブジェクト指向でクラスというキーワードはよく出てきますが、 Haskellにおける型クラスはオブジェクト指向におけるクラスとはちょっと異なるものですね。 型の分類とでも言いましょうか。型のグループとでも言いましょうか。 アドホックとは…
9.3 型の別名と付け替え newtype宣言について 昨日時間切れで作りきれなかったnewtype宣言のサンプル。 まぁ、悩んだ分理解が深まりました。 example5.hs newtype MyListNT a = MkMyListNT [a] myList :: MyListNT Int myList = MkMyListNT [1, 2, 3, 4] top…
9.3 型の別名と付け替え type宣言とnewtype宣言について type宣言は分かりやすいですね。C言語でいうところのtypedefのようなノリですね。 type MyInt = Int myData :: MyInt myData = 17 type MyArray a = [a] type MyIntArray = MyArray MyInt myArray :: …
9.2 代数的データ型 本文の内容とあんまり関係がないところですが、 フィールドラベルのパターンマッチの書き方が(個人的に)しっくり来ませんでした。 data Font = Font {aSize :: Int, aColor :: String, aStr :: String} getsize :: Font -> Int getsize (…
9.2 代数的データ型 再帰的な型について う〜ん、ちょっと難しい。。。一回読んだだけでは理解出来なかった。 細かく読み解いていこう。 本文中にあった例をそのまま使わせていただくと、 data Stack a = Empty | Push a (Stack a) という型宣言。 data Stac…
9.2 代数的データ型 引数のない関数は存在しない う〜む、今まで考えてもみなかった視点です。 引数のない関数は存在しない。 一方でデータコンストラクタは引数なしもあり。 合わせて覚えておきます。 列挙型スタイルと共用体型スタイル 本文中にあったBool…
9.2 代数的データ型 セレクタについて C言語に慣れている私にとっては、フィールドラベル+セレクタの使い方が一番しっくり来ますね。 こんな感じ。 {-- セレクタを使ってフィールド値を取得する。 --} main = do print $ aSize tagtag print $ aColor tagta…
9.2 代数的データ型 う〜ん、なかなか難しい用語ですね。 見失わないように頑張ります。 型コンストラクタとデータコンストラクタについて 本文中の例に習うと、 data FontTag = Font Int String String でHTMLのFONTタグを表してみました。 この中のFontTag…
9.1 静的型チェックと型推論 全然、Haskellと関係ないけど、型推論(type inference)のinfer。 今日のTOEICカレンダーの問題に出てきた単語だった。どうでもいいけど。 閑話休題。 型宣言を省略することが出来る、と聞いて連想するのが、RubyやSmalltalkな…
8.5 本章のまとめ 「脊髄反射的に」ポイントフリースタイル書き換えが身につくように頑張ります。 8.6 練習問題 いつものように実験しながら自力で解いていきます。 lstrip関数について dropWhile関数はこんな感じの動き。 Prelude> dropWhile (== 1) [1, 1,…
8.4 ポイントフリースタイル この章では、以前作成したfgrep.hsというソースコードを ポイントフリースタイルを使って書き直しています。こんな感じ。 fgrep.hs(修正前) fgrep :: String -> String -> String fgrep pattern cs = unlines $ filter match $ l…
8.4 ポイントフリースタイル むむむ…、なかなか難しい概念ですね。 頭の中を整理すると、要は 関数を式(値)ではなく、式(値)から独立した関数で定義すること をポイント(値)フリー(独立)スタイルというのかな。 たしかにこれまで関数を定義(関数に変数を束縛…
8.3 部分適用 セクションについて セクションと言われると、…何だか難しく聞こえますけど、でもそんなことはありません。 二項演算子の部分適用のことなんですね。 たとえば Prelude> :t (+ 4) (+ 4) :: (Num a) => a -> a Prelude> :t (* 2) (* 2) :: (Num …
8.3 部分適用 なるほど、引数の一部を指定して、新しい関数を作っちゃう。 関数型プログラミング言語の真骨頂ともいうべきでしょうか。 これまで見たことのない手法です。 ですが、とても自然に馴染む考え方です。 何となくですが、今までにあまりよく理解せ…
8.2 関数合成 これ、とても数学的な文法ですね。 数学だと ってよく書きそうですしね。関数適用順序も数学の文法と一致してる。 …ていうか文法というよりは、演算子なんですね。 うん、とても便利な機能ですね。 ありていな言い方をすれば、関数を部品化出来…
遂にHaskellの真骨頂(?)である、関数に進みます。 この章は特に重要なので、じっくりと読み進めていきます。 8.1 値としての関数 無名関数について λ式という言葉はよく耳にしていましたが、なるほど変数を束縛しない関数のことなんですね。 λ式と言うとこ…
7.8 本章のまとめ 練習問題がんばるぞ! 7.9 練習問題 いつものようにまずは自力でやってみます。 まずは実験。 Prelude> splitAt 3 [0,1,2,3,4] ([0,1,2],[3,4]) Prelude> splitAt 60 [0,1,2,3,4] ([0,1,2,3,4],[]) なるほど、引数のリストよりも大きい数値…
7.7 定義と束縛 let式とwhere節 確かに似てます。違いの説明がなければ、理解出来ませんでした。 第一の違い、letは式で、whereは節。 式は値を持つけど、whereは値を持たない。 letは式なので、let式をそのまま関数の定義や値として扱うことが出来るけど、 …
7.6 関数定義 演算子の優先順位と結合性について 日本語で書くと何だか難しく感じますね。でもプログラミングする際には普通に意識していることでした。 優先度はまぁよいとして、結合性の方。 同じ優先度の演算子が複数ある場合、どの演算子から評価される…
7.6 関数定義 二項演算子について 前にちょっと勘違いしていた二項演算子ですが、ここに書いてありましたね。 ここを読んでとても理解が深まりました。 そこでちょっと疑問が…。 二項演算子を定義する、と聞いて連想するのがC++の演算子のオーバーライドです…
7.5 case式 式というくらいなので、値を持ちます。 関数の引数と全く同じように記述出来るとのこと。 いつものように他愛のない例ですが、こんな感じ。 main = do print $ myCase 0 print $ myCase 101 print $ myCase 99 print $ myCase 33 myCase :: Int -…
7.4 パターンマッチ データコンストラクタによるパターン []と、(x:xs)の「:」がデータコンストラクタであるとのこと。 お馴染みのmap関数に現れる。 map :: (a -> b) -> [a] -> [b] map f [] = [] map f (x:xs) = f x : map f xs ちらりと第9章を覗き見した…
7.4 パターンマッチ 「_」パターン ちょっと分かりにくいけど、変数を束縛しない、というところがポイントですね。 こんな感じ。 myIf :: Bool -> a -> a -> a myIf True t _ = t myIf False _ e = e 引数を参照しない場合は「_」を使った方が、読み手にとっ…
7.3 if式 以前にも出てきた構文ですね。「式」なので、値を持つことに注意ですね。 なので、こんな書き方が出来ます。 Prelude> print $ if 4 == 4 then "True" else "False" "True" こういう風に書くよりもスマートですよね。 Prelude> if 4 == 4 then prin…
7.1 コメント リテレイト形式について まぁ、内容は理解出来ましたが、リテレイト形式は不思議な感じがします。 コードの方が脇役的になる書き方、ちょっと違和感がありますね。 こういうことが出来る、という楽しさはありますけど、あまり使わなさそうです…
6.8 本章のまとめ 本章ではHaskellの基本データ型を学びました。 6.9 練習問題 今回の練習問題は評価の優先順位に関するもの。さっそくやってみよう。 まず一問目。 resolve f (x:xs) = (textify x) ++ (resolve f xs) 関数適用の箇所が始めに評価されるので…