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

Weitere ähnliche Inhalte

Was ist angesagt?

現実(えくせる)と戦う話
現実(えくせる)と戦う話現実(えくせる)と戦う話
現実(えくせる)と戦う話bleis tift
 
error handling using expected
error handling using expectederror handling using expected
error handling using expectedAkira Takahashi
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPAkira Takahashi
 
Template Meta Programming入門から応用まで
Template Meta Programming入門から応用までTemplate Meta Programming入門から応用まで
Template Meta Programming入門から応用までyoshihikoozaki5
 
C++ Template Metaprogramming
C++ Template MetaprogrammingC++ Template Metaprogramming
C++ Template MetaprogrammingAkira Takahashi
 
オブジェクト指向入門7
オブジェクト指向入門7オブジェクト指向入門7
オブジェクト指向入門7Kenta Hattori
 
F#によるFunctional Programming入門
F#によるFunctional Programming入門F#によるFunctional Programming入門
F#によるFunctional Programming入門bleis tift
 
すごいHaskell 第7章 型や型クラスを自分で作ろう(後編)
すごいHaskell 第7章 型や型クラスを自分で作ろう(後編)すごいHaskell 第7章 型や型クラスを自分で作ろう(後編)
すごいHaskell 第7章 型や型クラスを自分で作ろう(後編)Nozomu Kaneko
 
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~Nobuhisa Koizumi
 
研究生のためのC++ no.4
研究生のためのC++ no.4研究生のためのC++ no.4
研究生のためのC++ no.4Tomohiro Namba
 
Swift らしい表現を目指そう #eventdots
Swift らしい表現を目指そう #eventdotsSwift らしい表現を目指そう #eventdots
Swift らしい表現を目指そう #eventdotsTomohiro Kumagai
 
研究生のためのC++ no.3
研究生のためのC++ no.3研究生のためのC++ no.3
研究生のためのC++ no.3Tomohiro Namba
 
やさしく知りたいC言語
やさしく知りたいC言語やさしく知りたいC言語
やさしく知りたいC言語uru nru
 
アルゴリズムとデータ構造2
アルゴリズムとデータ構造2アルゴリズムとデータ構造2
アルゴリズムとデータ構造2Kenta Hattori
 
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプC++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプKohsuke Yuasa
 
言語処理系入門3
言語処理系入門3言語処理系入門3
言語処理系入門3Kenta Hattori
 

Was ist angesagt? (20)

Emcpp0506
Emcpp0506Emcpp0506
Emcpp0506
 
現実(えくせる)と戦う話
現実(えくせる)と戦う話現実(えくせる)と戦う話
現実(えくせる)と戦う話
 
error handling using expected
error handling using expectederror handling using expected
error handling using expected
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JP
 
C言語講習会4
C言語講習会4C言語講習会4
C言語講習会4
 
C言語講習会3
C言語講習会3C言語講習会3
C言語講習会3
 
Template Meta Programming入門から応用まで
Template Meta Programming入門から応用までTemplate Meta Programming入門から応用まで
Template Meta Programming入門から応用まで
 
C++ Template Metaprogramming
C++ Template MetaprogrammingC++ Template Metaprogramming
C++ Template Metaprogramming
 
オブジェクト指向入門7
オブジェクト指向入門7オブジェクト指向入門7
オブジェクト指向入門7
 
C言語講習会2
C言語講習会2C言語講習会2
C言語講習会2
 
F#によるFunctional Programming入門
F#によるFunctional Programming入門F#によるFunctional Programming入門
F#によるFunctional Programming入門
 
すごいHaskell 第7章 型や型クラスを自分で作ろう(後編)
すごいHaskell 第7章 型や型クラスを自分で作ろう(後編)すごいHaskell 第7章 型や型クラスを自分で作ろう(後編)
すごいHaskell 第7章 型や型クラスを自分で作ろう(後編)
 
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~
 
研究生のためのC++ no.4
研究生のためのC++ no.4研究生のためのC++ no.4
研究生のためのC++ no.4
 
Swift らしい表現を目指そう #eventdots
Swift らしい表現を目指そう #eventdotsSwift らしい表現を目指そう #eventdots
Swift らしい表現を目指そう #eventdots
 
研究生のためのC++ no.3
研究生のためのC++ no.3研究生のためのC++ no.3
研究生のためのC++ no.3
 
やさしく知りたいC言語
やさしく知りたいC言語やさしく知りたいC言語
やさしく知りたいC言語
 
アルゴリズムとデータ構造2
アルゴリズムとデータ構造2アルゴリズムとデータ構造2
アルゴリズムとデータ構造2
 
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプC++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプ
 
言語処理系入門3
言語処理系入門3言語処理系入門3
言語処理系入門3
 

Ähnlich wie 第3章 型とクラス

Boost.Flyweight
Boost.FlyweightBoost.Flyweight
Boost.Flyweightgintenlabo
 
Brief introduction of Boost.ICL
Brief introduction of Boost.ICLBrief introduction of Boost.ICL
Brief introduction of Boost.ICLyak1ex
 
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)Hiro H.
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competitionyak1ex
 
C++ tips2 インクリメント編
C++ tips2 インクリメント編C++ tips2 インクリメント編
C++ tips2 インクリメント編道化師 堂華
 
TypeScript & 関数型講座 第2回 TypeScript という言語
TypeScript & 関数型講座 第2回 TypeScript という言語TypeScript & 関数型講座 第2回 TypeScript という言語
TypeScript & 関数型講座 第2回 TypeScript という言語gypsygypsy
 
Learning Template Library Design using Boost.Geomtry
Learning Template Library Design using Boost.GeomtryLearning Template Library Design using Boost.Geomtry
Learning Template Library Design using Boost.GeomtryAkira Takahashi
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Ransui Iso
 
TypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービューTypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービューAkira Inoue
 
Impractical Introduction of Boost Spirit Qi [PPT]
Impractical Introduction of Boost Spirit Qi [PPT]Impractical Introduction of Boost Spirit Qi [PPT]
Impractical Introduction of Boost Spirit Qi [PPT]yak1ex
 
Python standard 2022 Spring
Python standard 2022 SpringPython standard 2022 Spring
Python standard 2022 Springanyakichi
 
Unity + C#講座①
Unity + C#講座①Unity + C#講座①
Unity + C#講座①Yu Yu
 
Ocaml lecture slides 01 at axsh
Ocaml lecture slides 01 at axshOcaml lecture slides 01 at axsh
Ocaml lecture slides 01 at axshTomofumi Hayashi
 

Ähnlich wie 第3章 型とクラス (15)

Boost.Flyweight
Boost.FlyweightBoost.Flyweight
Boost.Flyweight
 
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
 
Brief introduction of Boost.ICL
Brief introduction of Boost.ICLBrief introduction of Boost.ICL
Brief introduction of Boost.ICL
 
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
 
C++ tips2 インクリメント編
C++ tips2 インクリメント編C++ tips2 インクリメント編
C++ tips2 インクリメント編
 
TypeScript & 関数型講座 第2回 TypeScript という言語
TypeScript & 関数型講座 第2回 TypeScript という言語TypeScript & 関数型講座 第2回 TypeScript という言語
TypeScript & 関数型講座 第2回 TypeScript という言語
 
Learning Template Library Design using Boost.Geomtry
Learning Template Library Design using Boost.GeomtryLearning Template Library Design using Boost.Geomtry
Learning Template Library Design using Boost.Geomtry
 
Hupc 1
Hupc 1Hupc 1
Hupc 1
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3
 
TypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービューTypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービュー
 
Impractical Introduction of Boost Spirit Qi [PPT]
Impractical Introduction of Boost Spirit Qi [PPT]Impractical Introduction of Boost Spirit Qi [PPT]
Impractical Introduction of Boost Spirit Qi [PPT]
 
Python standard 2022 Spring
Python standard 2022 SpringPython standard 2022 Spring
Python standard 2022 Spring
 
Unity + C#講座①
Unity + C#講座①Unity + C#講座①
Unity + C#講座①
 
Ocaml lecture slides 01 at axsh
Ocaml lecture slides 01 at axshOcaml lecture slides 01 at axsh
Ocaml lecture slides 01 at axsh
 

第3章 型とクラス

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