SlideShare ist ein Scribd-Unternehmen logo
1 von 27
Downloaden Sie, um offline zu lesen


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) // 20
sum(of: floats) // 10
func average <C:Collection> (of values: C ) -> C.Element
where C.Element : BinaryInteger {
return values.reduce(into: 0, +=) / C.Element(values.count)
}
extension Array {
// 変換元は、要素の型が同じならどんな Sequence でも良い
init<S:Sequence>(_ s: S) where Element == S.Element
}
// どんな Sequence も配列型に変換できる
Array([1, 5, 8, 3, 7, 3]) // Array
Array([1, 5, 8, 3, 7, 3][2 ..< 5]) // ArraySlice
Array(1 ..< 20) // CountableRange
Array(zip([1, 3, 5], [2, 4, 6])) // Zip2Sequence<Array, Array>
// この書き方はパッと思いつかなくても、
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, +=)
}
}
struct Array :
MutableCollectionType,
Sliceable,
ArrayLiteralConvertible {
}
// 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]
}




func areaOfCircle<T:FloatingPoint>(withRadius radius: T) -> T {
return radius * radius * T.pi
}
areaOfCircle(withRadius: 2 as Double) // 12.566370614359172
areaOfCircle(withRadius: 2 as Float) // 12.56637
areaOfCircle(withRadius: 2 as Float80) // 12.566370614359172464


extension String {
// 現在主流の API
func repeated(_ count: Int) -> String
// Protocol-Oriented Integers を用いた API
func repeated<T:BinaryInteger>(_ count: T) -> String
}
"*".repeated(5) // "*****"
extension String {
func repeated<T:UnsignedInteger>(_ count: T) -> String
}
"*".repeated(5)


Protocol-Oriented Integers に想うジェネリックプログラミングの未来

Weitere ähnliche Inhalte

Was ist angesagt?

みんな大好き! Hello, World
みんな大好き! Hello, Worldみんな大好き! Hello, World
みんな大好き! Hello, World
Naohiro Aota
 
F#とC#で見る関数志向プログラミング
F#とC#で見る関数志向プログラミングF#とC#で見る関数志向プログラミング
F#とC#で見る関数志向プログラミング
satoshimurakumo
 

Was ist angesagt? (19)

while文
while文while文
while文
 
みんな大好き! Hello, World
みんな大好き! Hello, Worldみんな大好き! Hello, World
みんな大好き! Hello, World
 
プロトコル指向 - 夢と現実の狭間 #cswift
プロトコル指向 - 夢と現実の狭間 #cswiftプロトコル指向 - 夢と現実の狭間 #cswift
プロトコル指向 - 夢と現実の狭間 #cswift
 
Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp
Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorpSwift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp
Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp
 
F#とC#で見る関数志向プログラミング
F#とC#で見る関数志向プログラミングF#とC#で見る関数志向プログラミング
F#とC#で見る関数志向プログラミング
 
ナウなヤングにバカうけのイカしたタグ付き共用体
ナウなヤングにバカうけのイカしたタグ付き共用体ナウなヤングにバカうけのイカしたタグ付き共用体
ナウなヤングにバカうけのイカしたタグ付き共用体
 
my_min関数の動作説明
my_min関数の動作説明my_min関数の動作説明
my_min関数の動作説明
 
Swift らしい表現を目指そう #eventdots
Swift らしい表現を目指そう #eventdotsSwift らしい表現を目指そう #eventdots
Swift らしい表現を目指そう #eventdots
 
言語処理系入門€9
言語処理系入門€9言語処理系入門€9
言語処理系入門€9
 
Swift 3.0 の新機能 - 追加・変更まわりだけ、ざっくり紹介 2 #devsap
Swift 3.0 の新機能 - 追加・変更まわりだけ、ざっくり紹介 2 #devsapSwift 3.0 の新機能 - 追加・変更まわりだけ、ざっくり紹介 2 #devsap
Swift 3.0 の新機能 - 追加・変更まわりだけ、ざっくり紹介 2 #devsap
 
C++11
C++11C++11
C++11
 
Task
TaskTask
Task
 
AVAの話 #mentaicojs
AVAの話 #mentaicojsAVAの話 #mentaicojs
AVAの話 #mentaicojs
 
Mock and patch
Mock and patchMock and patch
Mock and patch
 
言語処理系入門4
言語処理系入門4言語処理系入門4
言語処理系入門4
 
More C++11
More C++11More C++11
More C++11
 
PHP language update 201211
PHP language update 201211PHP language update 201211
PHP language update 201211
 
WWDC 旅行の余談と Swift Open Hours 3 - Swift ラボで聞いてきた話 #cocoa_kansai
WWDC 旅行の余談と Swift Open Hours 3 - Swift ラボで聞いてきた話 #cocoa_kansaiWWDC 旅行の余談と Swift Open Hours 3 - Swift ラボで聞いてきた話 #cocoa_kansai
WWDC 旅行の余談と Swift Open Hours 3 - Swift ラボで聞いてきた話 #cocoa_kansai
 
Parser combinatorってなんなのさ
Parser combinatorってなんなのさParser combinatorってなんなのさ
Parser combinatorってなんなのさ
 

Ähnlich wie Protocol-Oriented Integers に想うジェネリックプログラミングの未来 (6)

templateとautoの型推論
templateとautoの型推論templateとautoの型推論
templateとautoの型推論
 
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
 
Java8 Lambda chapter5
Java8 Lambda chapter5Java8 Lambda chapter5
Java8 Lambda chapter5
 
What Dotty fixes @ Scala関西サミット
What Dotty fixes @ Scala関西サミットWhat Dotty fixes @ Scala関西サミット
What Dotty fixes @ Scala関西サミット
 
Swiftおさらい
SwiftおさらいSwiftおさらい
Swiftおさらい
 

Mehr von Tomohiro Kumagai

Mehr von Tomohiro Kumagai (20)

最近気づいた勉強法 — 勉強会開催の習慣化 #yumemi_grow
最近気づいた勉強法 — 勉強会開催の習慣化 #yumemi_grow最近気づいた勉強法 — 勉強会開催の習慣化 #yumemi_grow
最近気づいた勉強法 — 勉強会開催の習慣化 #yumemi_grow
 
Swift 所有権 要諦 #ゆるちとせ
Swift 所有権 要諦 #ゆるちとせSwift 所有権 要諦 #ゆるちとせ
Swift 所有権 要諦 #ゆるちとせ
 
_Function Builders in Swift #love_swift
_Function Builders in Swift #love_swift_Function Builders in Swift #love_swift
_Function Builders in Swift #love_swift
 
Property Wrappers の特徴を眺める #swiftzoomin
Property Wrappers の特徴を眺める #swiftzoominProperty Wrappers の特徴を眺める #swiftzoomin
Property Wrappers の特徴を眺める #swiftzoomin
 
みんなで Swift 復習会 GO! in "Swift Days Fukuoka" – 12nd′ オープニング&資料
みんなで Swift 復習会 GO! in "Swift Days Fukuoka" – 12nd′ オープニング&資料みんなで Swift 復習会 GO! in "Swift Days Fukuoka" – 12nd′ オープニング&資料
みんなで Swift 復習会 GO! in "Swift Days Fukuoka" – 12nd′ オープニング&資料
 
みんなで Swift 復習会
GO! in 札幌 – 10th′′
みんなで Swift 復習会
GO! in 札幌 – 10th′′みんなで Swift 復習会
GO! in 札幌 – 10th′′
みんなで Swift 復習会
GO! in 札幌 – 10th′′
 
イニシャライザー Part 2.5 #hakataswift
イニシャライザー Part 2.5 #hakataswiftイニシャライザー Part 2.5 #hakataswift
イニシャライザー Part 2.5 #hakataswift
 
ニコニコ超会議・文化の交差点 #techpub #ニコニコ超会議 #さくらシンデレラ
ニコニコ超会議・文化の交差点 #techpub #ニコニコ超会議 #さくらシンデレラニコニコ超会議・文化の交差点 #techpub #ニコニコ超会議 #さくらシンデレラ
ニコニコ超会議・文化の交差点 #techpub #ニコニコ超会議 #さくらシンデレラ
 
Swift クラスのイニシャライザー #devsap
Swift クラスのイニシャライザー #devsapSwift クラスのイニシャライザー #devsap
Swift クラスのイニシャライザー #devsap
 
iOSCon 2019 in London #ioscon #love_swift
iOSCon 2019 in London #ioscon #love_swiftiOSCon 2019 in London #ioscon #love_swift
iOSCon 2019 in London #ioscon #love_swift
 
Around the 変数 let #love_swift
Around the 変数 let #love_swiftAround the 変数 let #love_swift
Around the 変数 let #love_swift
 
もくもく執筆会 #技術同人誌再販Night
もくもく執筆会 #技術同人誌再販Nightもくもく執筆会 #技術同人誌再販Night
もくもく執筆会 #技術同人誌再販Night
 
みんなで Swift 復習会 GO! in 岩手 – 9th′
みんなで Swift 復習会 GO! in 岩手 – 9th′みんなで Swift 復習会 GO! in 岩手 – 9th′
みんなで Swift 復習会 GO! in 岩手 – 9th′
 
macOS アプリで Swift Package Manager を使ってみる #love_swift #hakataswift
macOS アプリで Swift Package Manager を使ってみる #love_swift #hakataswiftmacOS アプリで Swift Package Manager を使ってみる #love_swift #hakataswift
macOS アプリで Swift Package Manager を使ってみる #love_swift #hakataswift
 
みんなで Swift 復習会 GO! in 福岡 – 8th′ #minna_de_swift
みんなで Swift 復習会 GO! in 福岡 – 8th′ #minna_de_swiftみんなで Swift 復習会 GO! in 福岡 – 8th′ #minna_de_swift
みんなで Swift 復習会 GO! in 福岡 – 8th′ #minna_de_swift
 
Getting Started with Attending iOSCon in London 高画質・追記版 #love_swift #ioscon
Getting Started with Attending iOSCon in London 高画質・追記版 #love_swift #iosconGetting Started with Attending iOSCon in London 高画質・追記版 #love_swift #ioscon
Getting Started with Attending iOSCon in London 高画質・追記版 #love_swift #ioscon
 
みんなで Swift 復習会
GO! in 京都 – 6th′
みんなで Swift 復習会
GO! in 京都 – 6th′みんなで Swift 復習会
GO! in 京都 – 6th′
みんなで Swift 復習会
GO! in 京都 – 6th′
 
みんなで Swift 復習会 GO! in 福岡 – 5th′
みんなで Swift 復習会 GO! in 福岡 – 5th′みんなで Swift 復習会 GO! in 福岡 – 5th′
みんなで Swift 復習会 GO! in 福岡 – 5th′
 
勉強会の東京外開催の気持ち #yuru_bounen2017
勉強会の東京外開催の気持ち #yuru_bounen2017勉強会の東京外開催の気持ち #yuru_bounen2017
勉強会の東京外開催の気持ち #yuru_bounen2017
 
みんなで Swift 復習会 GO! in 福岡・発表資料
みんなで Swift 復習会 GO! in 福岡・発表資料みんなで Swift 復習会 GO! in 福岡・発表資料
みんなで Swift 復習会 GO! in 福岡・発表資料
 

Protocol-Oriented Integers に想うジェネリックプログラミングの未来

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7. 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) // 20 sum(of: floats) // 10
  • 8.
  • 9.
  • 10. func average <C:Collection> (of values: C ) -> C.Element where C.Element : BinaryInteger { return values.reduce(into: 0, +=) / C.Element(values.count) }
  • 11.
  • 12. extension Array { // 変換元は、要素の型が同じならどんな Sequence でも良い init<S:Sequence>(_ s: S) where Element == S.Element } // どんな Sequence も配列型に変換できる Array([1, 5, 8, 3, 7, 3]) // Array Array([1, 5, 8, 3, 7, 3][2 ..< 5]) // ArraySlice Array(1 ..< 20) // CountableRange Array(zip([1, 3, 5], [2, 4, 6])) // Zip2Sequence<Array, Array>
  • 13. // この書き方はパッと思いつかなくても、 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, +=) } }
  • 14.
  • 15.
  • 17. // 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] }
  • 18.
  • 19.
  • 20. func areaOfCircle<T:FloatingPoint>(withRadius radius: T) -> T { return radius * radius * T.pi } areaOfCircle(withRadius: 2 as Double) // 12.566370614359172 areaOfCircle(withRadius: 2 as Float) // 12.56637 areaOfCircle(withRadius: 2 as Float80) // 12.566370614359172464
  • 21.
  • 22. extension String { // 現在主流の API func repeated(_ count: Int) -> String // Protocol-Oriented Integers を用いた API func repeated<T:BinaryInteger>(_ count: T) -> String } "*".repeated(5) // "*****"
  • 23. extension String { func repeated<T:UnsignedInteger>(_ count: T) -> String } "*".repeated(5)
  • 24.
  • 25.
  • 26.