7.
型とは?
一旦、オブジェクト指向のクラスを忘れて、型について思い出しましょう。
※ 用語: 型 と データ型 は同意
int i = 123;
char c = 'a';
C言語
Java
int i = 123;
boolean b = true;
// String s = "abc" // String is Class, not data type.
Haskell
Prelude> :t True
True :: Bool
赤枠が"型"です。※クラスではありません。
8.
型における値の範囲
型には取りうる値の範囲が決まっています。
Java
int: -2147483648 .. 2147483647
boolean: true | false
Haskell
Prelude> :i Int
data Int = GHC.Types.I# GHC.Prim.Int#
Prelude> :i Bool
data Bool = False | True
9.
型における値の範囲
Haskellではデータ型を自分で定義できます
(JavaのEnumっぽい?)
Haskell
Prelude> data TrafficLight = Red | Yellow | Green
Prelude> :t Red
Red :: TrafficLight
※ RedはTrafficLight型の "値" です。
12.
「型クラスのインスタンスである型」とは?
Prelude> 123 == 123
True
Prelude> 'a' == 'b'
False
Prelude> :t (==)
(==) :: Eq a => a -> a -> Bool
Eq は型クラスです。
a は型です。
Eq a => はa型はEq型クラスのインスタンスである必要がある制約です。
(==)関数は、引数にEq型クラスのインスタンスa型を2つとり、Bool型を返し
ます。
Javaのinterfaceに似てるかも?
Haskell
13.
「型クラスのインスタンスである型」とは?
Prelude> :i Int
data Int = GHC.Types.I# GHC.Prim.Int# -- Defined in ‘GHC.Types’
..
instance Eq Int -- Defined in ‘GHC.Classes’
..
Prelude> :i Char
data Char = GHC.Types.C# GHC.Prim.Char# -- Defined in ‘GHC.Types’
..
instance Eq Char -- Defined in ‘GHC.Classes’
..
Int型も、Char型も、Eq型クラスのインスタンスで
す。
14.
「型クラスはインターフェースを定義してる」とは?
Prelude> :i Eq
class Eq a where
(==) :: a -> a -> Bool
(/=) :: a -> a -> Bool
x == y = not(x/=y)
x /= y = not(x==y)
== 関数 と /= 関数が実装すべき関数(インターフェース)です。
※ Eq型クラスはデフォルト実装が定義されているので、 (==)
を実装すれば最小完全定義を満たせる
15.
「型クラスはインターフェースを定義してる」とは?
Prelude> :i TrafficLight
data TrafficLight = Red | Yellow | Green
Prelude> Red == Red
No instance for (Eq TrafficLight) arising from a use of ‘==’
Prelude> :set +m
Prelude> instance Eq TrafficLight where
Prelude| Red == Red = True
Prelude| Green == Green = True
Prelude| Yellow == Yellow = True
Prelude| _ == _ = False
Prelude|
Prelude> :i TrafficLight
data TrafficLight = Red | Yellow | Green
instance Eq TrafficLight
Prelude> Red == Red
True
自分で定義した型をEq型クラスのインスタンスにしてみる
↑この時点では (==) は使えない
←Eq型クラスのインスタンスにしたので
(==) が使えるようになった!
19.
多相(Polymorphism)とは?
ポリモーフィズムあるいはポリモルフィズム(Polymorphism)と
は、プログラミング言語の型システムの性質を表すもので、プログ
ラミング言語の各要素(定数、変数、式、オブジェクト、関数、メ
ソッドなど)についてそれらが複数の型に属することを許すという
性質を指す。
by Wikipedia
アドホック多相にいく前に、多相覚えてますか?
20.
多相(Polymorphism)とは?
普段、オブジェクト指向言語で使ってるのは
派生型多相(Subtype Polymorphism)
abstract class Animal {
def bark(): String
}
class Cat extends Animal {
def bark() = "にゃあ"
}
class Dog extends Animal {
def bark() = "わん"
}
val animal1 = new Cat()
val animal2 = new Dog()
animal1.bark // "にゃあ"
animal2.bark // "わん"
Scala
Clipping is a handy way to collect and organize the most important slides from a presentation. You can keep your great finds in clipboards organized around topics.
Be the first to comment