52. 遅延コレクション(Scala)
52Ⓒ Classmethod, Inc.
• ビューはmap, filter等の変換メソッド処理を
遅延するコレクションを提供する
val vectorView = Vector(1 to 5: _*).view
val middleView =
vectorView.map { x => println(x); x * 2 }
middleView.map { _ + 3 }.force
Scala code
53. 遅延コレクション(Scala)
53Ⓒ Classmethod, Inc.
• ビューはmap, filter等の変換メソッド処理を
遅延するコレクションを提供する
val vectorView = Vector(1 to 5: _*).view
val middleView =
vectorView.map { x => println(x); x * 2 }
middleView.map { _ + 3 }.force
Scala code
遅延コレクション生成
54. 遅延コレクション(Scala)
54Ⓒ Classmethod, Inc.
• ビューはmap, filter等の変換メソッド処理を
遅延するコレクションを提供する
val vectorView = Vector(1 to 5: _*).view
val middleView =
vectorView.map { x => println(x); x * 2 }
middleView.map { _ + 3 }.force
Scala code
遅延コレクション生成
この時点では中の処理は実施されず
中間のVectorも作成されない
55. 遅延コレクション(Scala)
55Ⓒ Classmethod, Inc.
• ビューはmap, filter等の変換メソッド処理を
遅延するコレクションを提供する
val vectorView = Vector(1 to 5: _*).view
val middleView =
vectorView.map { x => println(x); x * 2 }
middleView.map { _ + 3 }.force
Scala codeforceメソッドで正格コレクションに戻され、
それまでの変換メソッド処理が実施される。
(1 2 3 4 5が出力される)
遅延コレクション生成
この時点では中の処理は実施されず
中間のVectorも作成されない
56. 遅延コレクション(Swift 2.x)
56Ⓒ Classmethod, Inc.
• LazySequenceプロトコルはmap, filter等の変換
メソッド処理を遅延するコレクションを提供する
let lazyArr = [1,2,3,4,5].lazy
let middleArr = lazyArr.map { x -> Int in
print(x); return x * 2
}
let endArr = middleArr.map { x in x + 3 }
for _ in endArr { }
Swift code
57. 遅延コレクション(Swift 2.x)
57Ⓒ Classmethod, Inc.
• LazySequenceプロトコルはmap, filter等の変換
メソッド処理を遅延するコレクションを提供する
let lazyArr = [1,2,3,4,5].lazy
let middleArr = lazyArr.map { x -> Int in
print(x); return x * 2
}
let endArr = middleArr.map { x in x + 3 }
for _ in endArr { }
Swift code
遅延コレクション生成
58. 遅延コレクション(Swift 2.x)
58Ⓒ Classmethod, Inc.
• LazySequenceプロトコルはmap, filter等の変換
メソッド処理を遅延するコレクションを提供する
let lazyArr = [1,2,3,4,5].lazy
let middleArr = lazyArr.map { x -> Int in
print(x); return x * 2
}
let endArr = middleArr.map { x in x + 3 }
for _ in endArr { }
Swift code
遅延コレクション生成
この時点では中の処理は
実施されず、中間のArrayも作成されない
59. 遅延コレクション(Swift 2.x)
59Ⓒ Classmethod, Inc.
• LazySequenceプロトコルはmap, filter等の変換
メソッド処理を遅延するコレクションを提供する
let lazyArr = [1,2,3,4,5].lazy
let middleArr = lazyArr.map { x -> Int in
print(x); return x * 2
}
let endArr = middleArr.map { x in x + 3 }
for _ in endArr { }
Swift code
必要になった時にそれまでの変換メソッド処理が実施される。
(1 2 3 4 5が出力される)
遅延コレクション生成
この時点では中の処理は
実施されず、中間のArrayも作成されない
60. 遅延評価のまとめ
60Ⓒ Classmethod, Inc.
Scala Swift
lazy修飾子
遅延引数
遅延コレクション
つけると評価は遅延
つけると評価は遅延
グローバル定数変数は
つけなくても遅延
名前渡しパラメーター @autoclosure
コレクションに対して
.viewで生成
force で正格評価
コレクションに対して
.lazyで生成
必要なときに評価
63. リスコフ置換原則
63Ⓒ Classmethod, Inc.
• リスコフ置換原則
Let Φ(x) be a property provable about
objects x of type T. Then Φ(y) should be true
for objects y of type S where S is a subtype
of T.
Liskov, and Wing(1993) A Behavioral Notion of Subtyping
86. 共変・反変
86Ⓒ Classmethod, Inc.
• 共変・反変で型引数xのある型同士の派生型を判別する
型引数が複数あり、共変・反変が共存する場合
反変型引数 共変型引数
↓ ↑
T
S
U
V
TはSの派生型 VはUの派生型
87. 共変・反変
87Ⓒ Classmethod, Inc.
• 共変・反変で型引数xのある型同士の派生型を判別する
型引数が複数あり、共変・反変が共存する場合
反変型引数 共変型引数
↓ ↑↑
T
S
U
V
TはSの派生型 VはUの派生型
[反変S, 共変V]は[反変T, 共変U]の派生型
88. 共変・反変
88Ⓒ Classmethod, Inc.
• 共変・反変で型引数xのある型同士の派生型を判別する
型引数が複数あり、共変・反変が共存する場合
→共変型引数については派生順序を保持、
反変型引数については派生順序を逆転
反変型引数 共変型引数
↓ ↑↑
T
S
U
V
TはSの派生型 VはUの派生型
[反変S, 共変V]は[反変T, 共変U]の派生型
102. 反変(Scala)
102Ⓒ Classmethod, Inc.
• -を型引数の前につけると反変となる
class Consumer[-T] {
def consume(p: T) = {}
}
var anyConsumer: Consumer[Any] =
new Consumer[Any]()
var intConsumer: Consumer[Int] =
new Consumer[Int]()
intConsumer = anyConsumer
Scala code
103. 反変(Scala)
103Ⓒ Classmethod, Inc.
• -を型引数の前につけると反変となる
class Consumer[-T] {
def consume(p: T) = {}
}
var anyConsumer: Consumer[Any] =
new Consumer[Any]()
var intConsumer: Consumer[Int] =
new Consumer[Int]()
intConsumer = anyConsumer
Scala code
派生順序は Any > Int
104. 反変(Scala)
104Ⓒ Classmethod, Inc.
• -を型引数の前につけると反変となる
class Consumer[-T] {
def consume(p: T) = {}
}
var anyConsumer: Consumer[Any] =
new Consumer[Any]()
var intConsumer: Consumer[Int] =
new Consumer[Int]()
intConsumer = anyConsumer
Scala code
派生順序は Any > Int
型引数の派生順序が逆転、
Consumer[Any] は Consumer[Int]の派生型として扱える
113. 反変(Swift 2.1)
113Ⓒ Classmethod, Inc.
• T -> S (関数の型)はTについて反変、Sについて共変
testVariance(innerIntAny)
testVariance(innerAnyInt)
testVariance(innerAnyAny)
testVariance(innerIntInt)
Swift code
114. 反変(Swift 2.1)
114Ⓒ Classmethod, Inc.
• T -> S (関数の型)はTについて反変、Sについて共変
testVariance(innerIntAny)
testVariance(innerAnyInt)
testVariance(innerAnyAny)
testVariance(innerIntInt)
Swift code
渡される関数の型は全て (Int) -> Any の派生型
115. 反変(Swift 2.1)
115Ⓒ Classmethod, Inc.
• T -> S (関数の型)はTについて反変、Sについて共変
testVariance(innerIntAny)
testVariance(innerAnyInt)
testVariance(innerAnyAny)
testVariance(innerIntInt)
Swift code
将来反変を表すためのキーワードが入るかも?(憶測
渡される関数の型は全て (Int) -> Any の派生型