Your SlideShare is downloading. ×
0
第3章 型とクラス
第3章 型とクラス
第3章 型とクラス
第3章 型とクラス
第3章 型とクラス
第3章 型とクラス
第3章 型とクラス
第3章 型とクラス
第3章 型とクラス
第3章 型とクラス
第3章 型とクラス
第3章 型とクラス
第3章 型とクラス
第3章 型とクラス
第3章 型とクラス
第3章 型とクラス
第3章 型とクラス
第3章 型とクラス
第3章 型とクラス
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

第3章 型とクラス

956

Published on

スタートHaskellでの発表資料です。

スタートHaskellでの発表資料です。

1 Comment
0 Likes
Statistics
Notes
  • Be the first to like this

No Downloads
Views
Total Views
956
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
1
Comments
1
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. 第3章 型とクラス<br />竹辺靖昭 (@beketa)<br />
  • 2. 基本概念<br />型とは?<br />互いに関連する値の集合<br />例: Bool型はFalseとTrueという値を持つ<br />v :: T 「vは型Tの値である」<br />例: False :: Bool not :: Bool -&gt; Bool -- Bool型をBool型に変換する関数の型 not True :: Bool<br />型推論<br />関数適用の型付け規則:f :: A -&gt; B かつ e :: A ならば f e :: B<br />すべての式は型を持たなければいけない<br />推論できない式(例: not 3)は型エラーとなる<br />Haskellは事前に型検査をおこなうので型安全である(型安全だからといってエラーがないわけではない: 1 `div` 0)<br />
  • 3. 基本概念(続き)<br />GHCのコマンド<br />:type (Hugsと同じ)<br />:t とも書ける<br />GHCでのセッション例:*Main&gt; :type notnot :: Bool -&gt; Bool*Main&gt; :t not Falsenot False :: Bool*Main&gt; :t not 3&lt;interactive&gt;:1:5:No instance for (Num Bool)(以下略)<br />
  • 4. 基本型<br />Bool : TrueとFalse<br />Char : 文字 &apos;a&apos;, &apos;A&apos;, &apos;3&apos;, &apos;_&apos;, &apos;n&apos; など<br />String : 文字列 &quot;abc&quot; (Charのリスト [Char])<br />Int: 固定精度整数<br />Integer : 多倍長整数<br />Float : 単精度浮動小数点数<br />数値は複数の型を持ちうる<br />3:: Int, 3 :: Integer, 3 :: Float のどれも有効<br />
  • 5. リスト型<br />リスト<br />同じ型の要素の並びT型の要素を持つリストの型を[T]と書く<br />例: [False, True, False] :: [Bool] [&apos;a&apos;, &apos;b&apos;, &apos;c&apos;, &apos;d&apos;] :: [Char] (&quot;abcd&quot;と同じ) [&quot;One&quot;, &quot;Two&quot;, &quot;Three&quot;] :: [String]<br />リスト型の特徴<br />リストの型には長さの情報は含まれていない<br />要素の型に特に制約はない(何のリストでも作ることができる)<br />リストの長さには制限はない(無限リストも可)<br />
  • 6. タプル型<br />タプル<br />有限個の要素の組(各要素の型は違っていてもよい)<br />i番目の要素が型Tiを持つときタプルの型を(T1, T2, ..., Tn)と書く(i = 1 ... n)<br />例: (False, True) :: (Bool, Bool) (False, &apos;a&apos;, True) :: (Bool, Char, Bool) (&quot;Yes&quot;, True, &apos;a&apos;) :: (String, Bool, Char)<br />() : ユニット<br />組(double) : 要素数2のタプル<br />三つ組(triple) : 要素数3のタプル<br />タプルの特徴<br />タプルの型には長さの情報が含まれている<br />要素の型に特に制約はない(何のタプルでも作ることができる)<br />タプルの要素数は有限<br />
  • 7. 関数型<br />T1の引数をT2に変換する関数の型をT1 -&gt; T2と書く<br />例: not :: Bool -&gt; BoolisDigit :: Char -&gt; Bool<br />特徴<br />引数と結果の型には制約はないリストやタプルを使えば複数の引数を取る関数などを定義できる<br />例: add :: (Int, Int) -&gt; Int add (x, y) = x + yzeroto :: Int -&gt; [Int]zeroto n = [0 .. n]<br />全域関数である必要はない(例: headは[]には定義されていない)<br />
  • 8. 関数型(続き)<br />余談: GHCでのisDigitの使い方Hugsの例で載っていた:loadコマンドではPrelude&gt; :load Data.Char&lt;no location info&gt;: module `Data.Char‘ is a package moduleFailed, modules loaded: none.となってしまいロードできないようであったPrelude&gt; import Data.CharPrelude Data.Char&gt; :t isDigitisDigit :: Char -&gt; Bool<br />
  • 9. カリー化された関数<br />カリー(Curry)化: 「カレー」と同じスペル<br />しかし「カレー化」とは表記しないようである<br />
  • 10. カリー化された関数<br />タプルを使わずに複数の引数を処理するやり方add&apos; :: Int -&gt; (Int -&gt; Int)add&apos; x y = x + yadd&apos; xは関数を返すその関数にyを与えるとx + yを返す<br />先ほどのタプルを使った足し算add :: (Int, Int) -&gt; Intadd (x, y) = x + y<br />addのような関数をadd&apos;のようにすることをカリー化という<br />3引数以上でもできる<br />
  • 11. カリー化された関数(続き)<br />カリー化された関数の方が柔軟である<br />部分適用(引数を部分的に与える)だけで関数を作ることができる<br />例: add&apos; 1はInt -&gt; Intの関数として使える<br />-&gt;は右結合Int -&gt; Int -&gt; Int -&gt; IntはInt -&gt; (Int -&gt; (Int -&gt; Int)) の意味である<br />関数適用は左結合mult x y z は((mult x) y) z の意味である<br />
  • 12. 多相型<br />リストの長さを求める関数lengthどんな型のリストの長さも求められる&gt; length [1, 3, 5, 7]4&gt; length [&quot;Yes&quot;, &quot;No&quot;]2<br />型変数: 「どんな型にも」を表す(小文字 a, b, c)<br />例: length :: [a] -&gt; Intfst :: (a, b) -&gt; a head :: [a] -&gt; a 等<br />
  • 13. 多重定義型<br />加算演算子 +IntやFloatなどの数値型の足し算ができる&gt; 1 + 23&gt; 1.1 + 2.23.3<br />クラス制約: 「どんな数値型にも」というような制約を表す<br />書き方 C aC: クラス名、a: 型変数 「クラスCのインスタンスであるどんな型aについても」<br />(+) :: Num a =&gt; a -&gt; a -&gt; aNumクラスのインスタンスであるどんな型aについても加算演算子(+)の型はa -&gt; a -&gt; aである<br />
  • 14. 多重定義型 (続き)<br />例: (-) :: Num a =&gt; a -&gt; a -&gt; a negate :: Num a =&gt; a -&gt; a abs :: Num a =&gt; a -&gt; a<br />数値自体も多重定義されている3 :: Num a =&gt; a<br />
  • 15. 基本クラス<br />クラス<br />共通のメソッド(多重定義された関数)を提供する型の集合<br />クラスのインスタンス: クラスの要素<br />Eq: 等しいかどうか判定できる<br />以下のメソッドが定義されている<br />(==) :: a -&gt; a -&gt; Bool<br />(/=) :: a -&gt; a -&gt; Bool<br />Bool, Char, String, Int, IntegerなどはEqのインスタンス<br />Eqのインスタンスのリスト、タプルもEqのインスタンス<br />関数型はEqクラスのインスタンスではない<br />
  • 16. 基本クラス (続き)<br />Ord: 順序がつけられる<br />Eqクラスのインスタンスであり、以下のメソッドが定義されている<br />(&lt;) :: a -&gt; a -&gt; Bool<br />(&lt;=) :: a -&gt; a -&gt; Bool<br />(&gt;) :: a -&gt; a -&gt; Bool<br />(&gt;=) :: a -&gt; a -&gt; Bool<br />min :: a -&gt; a -&gt; a<br />max :: a -&gt; a -&gt; a<br />Bool, Char等はOrdのインスタンス<br />Ordのインスタンスのリスト、タプルもOrdのインスタンス(辞書式順序)<br />
  • 17. 基本クラス (続き)<br />Show: 表示できる(文字列に変換できる)<br />show :: a -&gt; String<br />Read: 文字列から変換できる<br />read :: String -&gt; a<br />readの結果の型は文脈から決まる場合にはその型になるnot (read &quot;False&quot;)のread &quot;False&quot;の型はBool<br />決まらない場合には結果の型を指定すればよい&gt; read &quot;123&quot;&lt;interactive&gt;:1:1: Ambiguous type variable `a0‘ in the constraint:(中略)&gt; read &quot;123&quot; :: Int123<br />目的の型に変換できないような文字列が入力されるとエラーになるnot (read &quot;Hello&quot;)はエラーになる<br />
  • 18. 基本クラス (続き)<br />Num: 数値<br />EqとShowのインスタンスであり、以下のメソッドが定義されている<br />(+) :: a -&gt; a -&gt; a<br />(-) :: a -&gt; a -&gt; a<br />(*) :: a -&gt; a -&gt; a<br />negate :: a -&gt; a<br />abs :: a -&gt; a<br />signum :: a -&gt; a<br />Integral: 整数<br />Numのインスタンスであり、以下のメソッドが定義されている<br />div :: a -&gt; a -&gt; a<br />mod :: a -&gt; a -&gt; a<br />Fractional: 分数<br />Numのインスタンスであり、以下のメソッドが定義されている<br />(/) :: a -&gt; a -&gt; a<br />recip :: a -&gt; a -- 逆数<br />
  • 19. 参考文献<br />George Boole<br />Bool代数を作った人<br />Haskell Curry<br />カリー化を考えた人 (Haskellのカレーではない)<br />Haskell Report<br />型システムの詳細が書いてある<br />http://www.haskell.org/definition<br />

×