日経スマートワーク経営フォーラム 入会のご案内 · c 未来構想セッション(4時間)–未来予測を起点とした事業構想力を養う-【ねらい】
Protocol-Oriented Integers に想うジェネリックプログラミングの未来
-
Upload
tomohiro-kumagai -
Category
Environment
-
view
1.368 -
download
0
Transcript of Protocol-Oriented Integers に想うジェネリックプログラミングの未来
![Page 1: Protocol-Oriented Integers に想うジェネリックプログラミングの未来](https://reader033.fdocuments.net/reader033/viewer/2022050614/5a64797d7f8b9a3b568b4767/html5/thumbnails/1.jpg)
![Page 2: Protocol-Oriented Integers に想うジェネリックプログラミングの未来](https://reader033.fdocuments.net/reader033/viewer/2022050614/5a64797d7f8b9a3b568b4767/html5/thumbnails/2.jpg)
![Page 3: Protocol-Oriented Integers に想うジェネリックプログラミングの未来](https://reader033.fdocuments.net/reader033/viewer/2022050614/5a64797d7f8b9a3b568b4767/html5/thumbnails/3.jpg)
![Page 4: Protocol-Oriented Integers に想うジェネリックプログラミングの未来](https://reader033.fdocuments.net/reader033/viewer/2022050614/5a64797d7f8b9a3b568b4767/html5/thumbnails/4.jpg)
![Page 5: Protocol-Oriented Integers に想うジェネリックプログラミングの未来](https://reader033.fdocuments.net/reader033/viewer/2022050614/5a64797d7f8b9a3b568b4767/html5/thumbnails/5.jpg)
![Page 6: Protocol-Oriented Integers に想うジェネリックプログラミングの未来](https://reader033.fdocuments.net/reader033/viewer/2022050614/5a64797d7f8b9a3b568b4767/html5/thumbnails/6.jpg)
![Page 7: Protocol-Oriented Integers に想うジェネリックプログラミングの未来](https://reader033.fdocuments.net/reader033/viewer/2022050614/5a64797d7f8b9a3b568b4767/html5/thumbnails/7.jpg)
func sum<T : Numeric>(of values: Array<T>) -> T {
return values.reduce(0) { $0 + $1 }}
// Int の配列でも、Float の配列でも、使える let integers = [5, 5, 5, 5]let floats = [2.5, 2.5, 2.5, 2.5] as [Float]
sum(of: integers) // 20sum(of: floats) // 10
![Page 8: Protocol-Oriented Integers に想うジェネリックプログラミングの未来](https://reader033.fdocuments.net/reader033/viewer/2022050614/5a64797d7f8b9a3b568b4767/html5/thumbnails/8.jpg)
![Page 9: Protocol-Oriented Integers に想うジェネリックプログラミングの未来](https://reader033.fdocuments.net/reader033/viewer/2022050614/5a64797d7f8b9a3b568b4767/html5/thumbnails/9.jpg)
![Page 10: Protocol-Oriented Integers に想うジェネリックプログラミングの未来](https://reader033.fdocuments.net/reader033/viewer/2022050614/5a64797d7f8b9a3b568b4767/html5/thumbnails/10.jpg)
func average <C:Collection> (of values: C ) -> C.Element where C.Element : BinaryInteger {
return values.reduce(into: 0, +=) / C.Element(values.count)}
![Page 11: Protocol-Oriented Integers に想うジェネリックプログラミングの未来](https://reader033.fdocuments.net/reader033/viewer/2022050614/5a64797d7f8b9a3b568b4767/html5/thumbnails/11.jpg)
![Page 12: Protocol-Oriented Integers に想うジェネリックプログラミングの未来](https://reader033.fdocuments.net/reader033/viewer/2022050614/5a64797d7f8b9a3b568b4767/html5/thumbnails/12.jpg)
extension Array {
// 変換元は、要素の型が同じならどんな Sequence でも良い init<S:Sequence>(_ s: S) where Element == S.Element}
// どんな Sequence も配列型に変換できる Array([1, 5, 8, 3, 7, 3]) // ArrayArray([1, 5, 8, 3, 7, 3][2 ..< 5]) // ArraySliceArray(1 ..< 20) // CountableRangeArray(zip([1, 3, 5], [2, 4, 6])) // Zip2Sequence<Array, Array>
![Page 13: Protocol-Oriented Integers に想うジェネリックプログラミングの未来](https://reader033.fdocuments.net/reader033/viewer/2022050614/5a64797d7f8b9a3b568b4767/html5/thumbnails/13.jpg)
// この書き方はパッと思いつかなくても、
func sum<T : Numeric>(of values: Array<T>) -> T {
return values.reduce(into: 0, +=)}
// こちらなら自然と書ける人も多いはず(上記より Swift らしいと思う)
extension Array where Element : Numeric {
func sum() -> Element {
return reduce(into: 0, +=) }}
![Page 14: Protocol-Oriented Integers に想うジェネリックプログラミングの未来](https://reader033.fdocuments.net/reader033/viewer/2022050614/5a64797d7f8b9a3b568b4767/html5/thumbnails/14.jpg)
![Page 15: Protocol-Oriented Integers に想うジェネリックプログラミングの未来](https://reader033.fdocuments.net/reader033/viewer/2022050614/5a64797d7f8b9a3b568b4767/html5/thumbnails/15.jpg)
![Page 16: Protocol-Oriented Integers に想うジェネリックプログラミングの未来](https://reader033.fdocuments.net/reader033/viewer/2022050614/5a64797d7f8b9a3b568b4767/html5/thumbnails/16.jpg)
struct Array : MutableCollectionType, Sliceable, ArrayLiteralConvertible {
}
![Page 17: Protocol-Oriented Integers に想うジェネリックプログラミングの未来](https://reader033.fdocuments.net/reader033/viewer/2022050614/5a64797d7f8b9a3b568b4767/html5/thumbnails/17.jpg)
// Swift 1 は“写像(map)”が主体 func map<C:CollectionType, T>(source: C, transform: (C.Generator.Element) -> T) -> [T]
// Swift 2 は“コレクション”が主体 extension CollectionType {
func map<T>(transform: (Generator.Element) -> T) -> [T]
}
![Page 18: Protocol-Oriented Integers に想うジェネリックプログラミングの未来](https://reader033.fdocuments.net/reader033/viewer/2022050614/5a64797d7f8b9a3b568b4767/html5/thumbnails/18.jpg)
![Page 19: Protocol-Oriented Integers に想うジェネリックプログラミングの未来](https://reader033.fdocuments.net/reader033/viewer/2022050614/5a64797d7f8b9a3b568b4767/html5/thumbnails/19.jpg)
![Page 20: Protocol-Oriented Integers に想うジェネリックプログラミングの未来](https://reader033.fdocuments.net/reader033/viewer/2022050614/5a64797d7f8b9a3b568b4767/html5/thumbnails/20.jpg)
func areaOfCircle<T:FloatingPoint>(withRadius radius: T) -> T { return radius * radius * T.pi}
areaOfCircle(withRadius: 2 as Double) // 12.566370614359172areaOfCircle(withRadius: 2 as Float) // 12.56637areaOfCircle(withRadius: 2 as Float80) // 12.566370614359172464
![Page 21: Protocol-Oriented Integers に想うジェネリックプログラミングの未来](https://reader033.fdocuments.net/reader033/viewer/2022050614/5a64797d7f8b9a3b568b4767/html5/thumbnails/21.jpg)
![Page 22: Protocol-Oriented Integers に想うジェネリックプログラミングの未来](https://reader033.fdocuments.net/reader033/viewer/2022050614/5a64797d7f8b9a3b568b4767/html5/thumbnails/22.jpg)
extension String {
// 現在主流の API func repeated(_ count: Int) -> String
// Protocol-Oriented Integers を用いた API func repeated<T:BinaryInteger>(_ count: T) -> String
}
"*".repeated(5) // "*****"
![Page 23: Protocol-Oriented Integers に想うジェネリックプログラミングの未来](https://reader033.fdocuments.net/reader033/viewer/2022050614/5a64797d7f8b9a3b568b4767/html5/thumbnails/23.jpg)
extension String {
func repeated<T:UnsignedInteger>(_ count: T) -> String
}
"*".repeated(5)
![Page 24: Protocol-Oriented Integers に想うジェネリックプログラミングの未来](https://reader033.fdocuments.net/reader033/viewer/2022050614/5a64797d7f8b9a3b568b4767/html5/thumbnails/24.jpg)
![Page 25: Protocol-Oriented Integers に想うジェネリックプログラミングの未来](https://reader033.fdocuments.net/reader033/viewer/2022050614/5a64797d7f8b9a3b568b4767/html5/thumbnails/25.jpg)
![Page 26: Protocol-Oriented Integers に想うジェネリックプログラミングの未来](https://reader033.fdocuments.net/reader033/viewer/2022050614/5a64797d7f8b9a3b568b4767/html5/thumbnails/26.jpg)
![Page 27: Protocol-Oriented Integers に想うジェネリックプログラミングの未来](https://reader033.fdocuments.net/reader033/viewer/2022050614/5a64797d7f8b9a3b568b4767/html5/thumbnails/27.jpg)