Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
[スクリプト] Swiftの型推論を学ぼう
Search
omochimetaru
March 23, 2024
Programming
560
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
[スクリプト] Swiftの型推論を学ぼう
スクリプトです
omochimetaru
March 23, 2024
More Decks by omochimetaru
See All by omochimetaru
Swift Concurrency 年表クイズ
omochi
3
330
型推論のちょっと深い話
omochi
1
560
Swiftの型推論を学ぼう | Let's Learn About Type Inference in Swift
omochi
4
11k
Swift6のprotocol
omochi
6
1.4k
SwiftSyntaxをうまく使おう
omochi
2
430
今から使えるSwiftとC++の新しいinterop手法
omochi
0
540
CSFixとラベルマッチ
omochi
0
490
Swiftのmodifyアクセサとコルーチン
omochi
0
950
Swiftのオーバーロード選択のスコア規則12種類
omochi
3
550
Other Decks in Programming
See All in Programming
海上で動くGoサーバー: goroutineとchannelでさばく航行データストリーム
atsuki_seo
0
1k
Java 27新機能 / Java 27 new features
kishida
2
190
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
410
Unity6 URPによる海底をテーマにしたVJシステムの解説 | Unity Shader 完全に理解した 勉強会
gam0022
0
240
The Rails Doctrine Decade
koic
2
440
設計次第でAIコードの読む量は減らせる / designing-for-code-reading
minodriven
32
14k
Omarchy Tokyo やると聞いて UMPC 買ってセットアップしてきた
mtsmfm
0
200
難しいけど、読めた。- OSSの入口に立った話。
sts11142
0
130
iOSDC2026登壇資料.pdf
riofujimon
0
200
WebRTC映像をAirPlayに対応させる挑戦.pdf
monolithic_adam
0
330
速く作れる。その次は、速く確かめられる開発へ 〜AIネイティブ開発を支える、Shift Down〜 / Can build fast. Next, moving to development where we can verify fast.
rkaga
8
5.3k
市販E-Readerを乗っ取れ 〜Embedded Swiftで電子ペーパーガジェットを制御する〜
trickart
0
230
Featured
See All Featured
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
450
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2.1k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
3
4.3k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.4k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
31k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.6k
Ruling the World: When Life Gets Gamed
codingconduct
0
380
Skip the Path - Find Your Career Trail
mkilby
1
240
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Chasing Engaging Ingredients in Design
codingconduct
0
340
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
290
Transcript
PNPDIJNFUBSV!USZ4XJGU5PLZP -FUT-FBSO"CPVU 5ZQF*OGFSFODFJO4XJGU Έͳ͞Μ͜Μʹͪɻ ͜Ε͔Βɺ4XJGUͷܕਪΛֶ΅͏ɺͱ͍͏Λ͠·͢ɻ "CPVU.F w *FOKPZSFBEJOHQSPQPTBMTPO4XJGU&WPMVUJPOBOE CSPXTJOHUIF4XJGUP ffi
DJBMGPSVNBTBIPCCZ w *DPPSHBOJ[FTUVEZHSPVQTGPDVTFEPOUIF4XJGU DPNQJMFS w *BNSFDPHOJ[FEBTBDPNNJUUFSUPUIF4XJGU DPNQJMFS PNPDIJNFUBSV ࢲ͓ͪϝλϧͱ͍͍·͢ɻ ༑ਓ͔Βʮ͓ͪ͞ΜʯͱݺΕ͍ͯ·͢ɻ ࢲ4XJGU͕େ͖Ͱ͢ɻ ͦΕΛಡΈॻ͖͢Δ͚ͩͰͳ͘ɺ4XJGUݴޠͷൃలʹڵຯ͕͋Γ·͢ɻ ͦΕͰɺެࣜϑΥʔϥϜ4XJGU&WPMVUJPOͷϓϩϙʔβϧΛΑ͘ݟ͍ͯ·͢ɻ ·ͨɺݴޠͷ࣮ͦͷͷͰ͋ΔίϯύΠϥʹڵຯ͕͋Γ·͢ɻ ؒͱڞʹ4XJGUίϯύΠϥʹ͍ͭͯͷษڧձΛӡӦ͍ͯͯ͠ɺௐͨ͜ͱΛൃ දͨ͠Γ͍ͯ͠·͢ɻ ͦΕͰҎલʹԿ͔ίϯύΠϥʹίϯτϦϏϡʔτͨ͜͠ͱ͕͋Γɺͦͷࡍʹ ίϛολʔʹೝఆ͞Ε͍ͯ·͢ɻ ࠓͦ͏ͨ͠׆ಈͷதͰͬͨ͜ͱΛ͠·͢ɻ
5ZQF*OGFSFODF w 0OFPG4XJGUTHSFBUFTUBQQFBMT w 5IFDPFYJTUFODFPGTBGFUZBOEFBTFPGXSJUJOH w 6OEFSTUBOEJOHUIF.JOETFUPGUIF$PNQJMFS w *IBWFMPPLFEJOUPJUBOEJNQMFNFOUFEJUJOUIFQBTU https://github.com/omochi/SwiftTypeInferenceHandsOn
w *IBWFDSFBUFEBTVJUBCMFFYQMBOBUJPOGPSCFHJOOFST Έͳ͞Μ4XJGUͷͲΜͳͱ͜Ζ͕͖Ͱ͠ΐ͏͔ɻ ܕͱ͔ϓϩτίϧࢦͱ͔ɺ͍Ζ͍Ζ͋Γ·͕͢ɺܕਪಛʹॏཁͩͱࢥ ͍·͢ɻ ܕਪɺ੩తܕ͚ʹΑΔ҆શੑͱɺܕͷলུʹΑΔهड़͢͠͞Λཱ྆͠ ͯ͘ΕΔૉΒ͍͠ػೳͰ͢ɻ ݱͷϓϩάϥϛϯάݴޠʹ͓͍ͯͨΓલͷػೳͰ͋Γɺٯʹҙࣝ ͍ͯ͠ͳ͍͔͠Ε·ͤΜɻ ͦΕ͙Β͍ॏཁ͔ͭجຊతͰ͋Δ͔Βʹɺ ͦΕΛৄ͍ͬͯ͘͠Δ͜ͱʹେ͖ͳՁ͕͋ΔͰ͠ΐ͏ɻ ίϯύΠϥ͕ܕਪΛ͢Δͱ͖ɺ ͦΕ͕ͲͷΑ͏ͳॲཧΛ͢Δ͔ͷ͕ࣝ͋Εɺ ίʔυΛॻ͘ͱ͖ʹʹͨͭࣄ͕͋ΔͰ͠ΐ͏ɻ Ҏલʹͦ͏ߟ͑ͨࢲɺ4XJGUͷܕਪʹ͍ͭͯௐɺ ίϯύΠϥͷ࣮ΛಡΈɺҰ෦Λ࠶࣮ͯ͠Έ·ͨ͠ɻ ͦͷ࣌ͳ͔ͳ͔ۤ࿑͠·ͨ͠ɻ ग़ͯ͘ΔใઐతͰ͘͠ɺίʔυෳࡶͰಡΈղ͘ྗ͕ඞཁͩͬͨͷ Ͱ͢ɻ ͦ͜Ͱࠓࢲɺ͜ͷܦݧΛ౿·͑ɺ 4XJGUͷܕਪͷجૅΛɺ୭Ͱ؆୯ʹཧղͰ͖ΔΑ͏ʹղઆ͠·͢ɻ
0VUMJOF w #BTJD#JEJSFDUJPOBM*OGFSFODF"MHPSJUIN w &YUFOTJPOTGPS4XJGU w *NQMJDJU5ZQF$POWFSTJPO w 0WFSMPBEJOH w
)PXUP*OWFTUJHBUF6TJOHUIF$PNQJMFS ࠓͷͷྲྀΕΛࣔ͠·͢ɻ ·ͣɺجૅతͳํͷਪΞϧΰϦζϜΛઆ໌͠·͢ɻ Ͱ͕͢͜ΕͱͯجૅతͳͨΊɺ4XJGUͷݴޠ༷ʹରԠ͢Δʹେ͖ͳෆ ͕͋Γ·͢ɻ ͦ͜Ͱ࣍ʹɺͦΕΛ4XJGU͚ʹ֦ுͯ͠ɺ ҉ͷܕมΦʔόʔϩʔυʹରԠ͢Δํ๏Λࣔ͠·͢ɻ ͜Ε͕ॏཁͳεςοϓͰɺΑΓൃలతͳ༰Λཧղ͢Δ͕͔ΓʹͳΓ·͢ɻ ࠷ޙʹɺίϯύΠϥΛͬͯܕਪͷಈ࡞ΛௐΔํ๏Λհ͠·͢ɻ ͜͜·Ͱͷʹج͚ͮɺΑΓߴͳ༰ΛࣗͰֶΜͰ͍͚ΔΑ͏ʹͳΔͰ ͠ΐ͏ɻ #JEJSFDUJPOBM5ZQF*OGFSFODF ͦΕͰΛ࢝Ί·͢ɻ ͡Ίʹɺ4XJGUͷܕਪ͕ํͰ͋Δͱ͍͏Λ͠·͢ɻ
&YBNQMFPG'PSXBSE*OGFSFODF func id<X>(_ x: X) -> X func main(i: Int)
{ let a = id(i) } ͜ͷίʔυΛݟ͍ͯͩ͘͞ɻ ίϯύΠϥ͕BͷܕΛ*OUͩͱਪ͠·͢ɻ ͦͷखॱ͜͏ͳΓ·͢ɻ !·ͣJ͕*OUͰ͢ɻ !͜Ε͕JEʹ͞ΕΔͷͰɺͦͷฦΓ͕*OUͰ͢ɻ !͜Ε͕Bʹೖ͞ΕΔͷͰɺBͷܕ͕*OUͰ͢ɻ !͜ͷखॱɺίʔυͷ࣮ߦॱͱಉ͡Ͱ୯७Ͱ͢ɻ ͜ͷΑ͏ʹܕΛॱ൪ʹ͍͚ͬͯਪ͕Ͱ͖ΔͷͰ͠ΐ͏͔ʁ ೦ͳ͕Βͦ͏͍͖·ͤΜɻ &YBNQMFPG3FWFSTF*OGFSFODF func id<X>(_ x: X) -> X func main(i: Int) { let a: Int = id(.init()) } ࣍͜ͷίʔυΛݟ͍ͯͩ͘͞ɻ υοτࣜͷJOJUͷݺͼग़͕͋͠ΔͷͰɺίϯύΠϥυοτͷલʹলུ͞Εͨܕ ໊Λਪ͠·͢ɻ ͦͷखॱ࣍ͷΑ͏ʹͳΓ·͢ɻ !Bͷܕ͕*OUͰ͢ɻ !JEͷฦΓͦΕʹೖ͞Ε͍ͯΔͷͰ*OUͰ͢ɻ
ͳͷͰɺͦͷҾ*OUͰ͢ɻ !ͦ͜ʹॻ͔ΕͨυοτࣜͳͷͰɺ*OUͷলུͱΈͳ͞Ε·͢ɻ !͜ͷखॱઌఔͷྫͱਅٯͷॱ൪Ͱ͢ɻ ͜ͷΑ͏ʹɺܕਪͰํʹܕใΛ͍͔͚Δඞཁ͕͋Γ·͢ɻ ͜ΕΛͲͷΑ͏ʹ࣮͢Εྑ͍͔આ໌͠·͢ɻ #BTJD5ZQF*OGFSFODF ͦΕͰ͔͜͜ΒɺجຊతͳܕਪͷΈΛઆ໌͠·͢ɻ "MHPSJUIN8 w "WPJEJOHGPSNBMEJTDVTTJPOT
*XJMMCSJF ZFYQMBJOUIF PXPG PQFSBUJPOT w ⚠1MFBTFGPSHFUBCPVUlJNQMJDJUUZQFJOGFSFODFzGPSBNPNFOU ΞϧΰϦζϜ8ͱ͍͏ܕਪͷํ๏͕͋Γ·͢ɻ ͜ΕΑ͘ΒΕͨجຊతͳͷͰɺ4XJGUϕʔε͜͏ͳ͍ͬͯ·͢ɻ ͜ΕΛ4XJGUΛྫʹͯ͠આ໌͍͖ͯ͠·͢ɻ ͨͩ͠ɺଟ͘ͷਓʹͱͬͯΘ͔Γ͍͢Α͏ʹɺݫີͳܗࣜతఆٛʹ৮Εͣɺ ͬ͘͟Γͱͨ͠ྲྀΕΛઆ໌͠·͢ɻ ·ͨɺ4XJGUʹ͓͚Δ҉ͷܕม͍ͬͨΜແࢹ͠·͢ɻ
5ZQF*OGFSFODF1SPDFTT0VUMJOF w 1BSTJOH$PEFJOUPBO"45 "CTUSBDU4ZOUBY5SFF w #JOEJOH5ZQF7BSJBCMFTUPUIF"45 w (FOFSBUJOH$POTUSBJOUTGSPN"45 w
3FQFBUFEMZ1FSGPSNJOH6OJ fi DBUJPOBOE4JNQMJ DBUJPO େ·͔ͳྲྀΕ࣍ͷΑ͏ʹͳΓ·͢ɻ ·ͣɺίʔυΛύʔεͯ͠"45ʹ͠·͢ɻ ࣍ʹɺ"45ʹܕมΛׂΓͯ·͢ɻ ͦͯ͠ɺ"45͔Β੍Λੜ͠·͢ɻ ࠷ޙʹɺ୯ҰԽͱ؆ԽΛ܁Γฦͯ͠ਪΛਐΊ·͢ɻ ͦΕͰɺͦΕͧΕͷखॱʹ͍ͭͯઆ໌͠·͢ɻ "45 "CTUSBDU4ZOUBY5SFF w "SFQSFTFOUBUJPOPGUIFDPEFJOBUSFFTUSVDUVSF w 5IFDPNQJMFS fi OETJUFBTZUPIBOEMF ·ͣɺίʔυΛύʔεͯ͠"45ʹ͠·͢ɻ "45ͱ͍͏ͷίʔυΛߏͰදͨ͠ͷͰ͢ɻ ςΩετͰ͋Δίʔυͱҧͬͯɺ ͞·͟·ͳॲཧΛ͘͢͠ͳΓ·͢ɻ &YBNQMFPG"45 func id<X>(_ x: X) -> X func main(i: Int) { let a = id(i) } WBSEFDMB DBMM EFDMSFGJE EFDMSFGJ "45ͷྫΛࣔ͠·͢ɻ BͷೖจΛ"45ʹͨ͠ͷΛӈʹද͍ࣔͯ͠·͢ɻ ίʔυͱͷରԠؔΛઆ໌͠·͢ɻ !·ͣɺBͷએݴͱॳظԽ͕࠷্෦ͷWBSEFDMϊʔυͱରԠ͠·͢ɻ !࣍ʹɺJEؔͷݺͼग़͕͠DBMMϊʔυͱରԠ͠·͢ɻ !ؔݺͼग़͠ͷରͱͯ͠ɺͦͷࢠϊʔυ͕ɺݺͼग़͞ΕΔؔJEͷࢀরΛ ͍࣋ͬͯ·͢ɻ
!·ͨɺؔʹ͢ҾͷJͷࢀর͕ɺ͏ҰͭͷࢠϊʔυͰ͢ɻ !͔͜͜Βઌɺ͜ͷ"45ʹରͯ͠ॲཧ͠·͢ɻ #JOEJOH5ZQF7BSJBCMFT w 5ZQFWBSJBCMFTBSFWBSJBCMFTXIFSFUZQFTBSFBTTJHOFE w #JOHJOHUZQFWBSJBCMFTUPUIFQBSUTPGUIF"45XIFSFUIFUZQFJTOPU ZFULOPXO w 5ZQFJOGFSFODFJTUIFUBTLPGEFUFSNJOJOHUIFUZQFTGPSBMMUZQF
WBSJBCMFT ࣍ܕมͷׂΓͯͰ͢ɻ ܕมͱɺܕ͕ೖΔมͷࣄͰ͢ɻ ͜ΕΛɺ"45ͷதͰɺ·ͩܕ͕Θ͔Βͳ͍෦ʹׂΓͯ·͢ɻ ܕਪͱɺશͯͷܕมͷܕΛܾఆ͢ΔλεΫͳͷͰ͢ɻ &YBNQMFPG#JOEJOH5ZQF7BSJBCMFT WBSEFDMB DBMM EFDMSFGJE EFDMSFGJ $T1 $T2 ($T3) -> $T3 Int <X> (X) -> X func id<X>(_ x: X) -> X func main(i: Int) { let a = id(i) } ઌఔͷ"45ʹܕมΛׂΓͯΔաఔΛݟͯΈ·͠ΐ͏ɻ !มBͷܕΘ͔Βͳ͍ͷͰܕม5Λ৽ͨʹಋೖ͠·͢ɻ ܕมͦͷҹͱͯ͠ઌ಄ʹυϧه߸Λ͚͍ͯ·͢ɻ !DBMMϊʔυͷܕΘ͔Βͳ͍ͷͰɺܕม5Λಋೖ͠·͢ɻ !JEؔܕ͕Θ͔Γ·͕͢ɺδΣωϦοΫύϥϝʔλ9ʹ͍ͭͯܕม5Λಋ ೖ͠·͢ɻ
!Jॻ͔Ε͍ͯΔܕ͕Θ͔Γ·͢ɻ ! (FOFSBUJOH$POTUSBJOUT w *OEJDBUJOHUIFSFMBUJPOTIJQCFUXFFOUZQFTBOEUZQFWBSJBCMFT w (FOFSBUJOHGSPN"45 w *OGFSFODFQSPHSFTTFTCZNBOJQVMBUJOHUIFTFUPGDPOTUSBJOUT ੍࣍ͷੜͰ͢ɻ
੍ͱ͍͏ͷɺܕܕมʹ͍ͭͯͷؔΛࣔ͢ͷͰ͢ɻ ίϯύΠϥ"45Λ८ճͯ͠ɺෳͷ੍Λੜ͠·͢ɻ ܕਪɺ͜ͷ੍ͷू߹Λૢ࡞͢Δ͜ͱͰܭࢉΛਐΊ·͢ɻ (FOFSBUJOH$POTUSBJOUTGSPN"TTJHONFOU4UBUFNFOU WBSEFDM init A B eq(A, B) ͭͷ੍ͷੜنଇΛࣔ͠·͢ɻ WBSEFDMϊʔυ͔ΒFRVBM੍Λੜ͠·͢ɻ มͷܕ"ͱॳظԽจͷܕ#ʹରͯ͠ɺ FR " # ͱॻ͍ͯɺ "ͱ#͕͍͜͠ͱΛҙຯ͠·͢ɻ
(FOFSBUJOH$POTUSBJOUTGSPN'VODUJPODBMMJOH DBMM DBMMFF BSHT R F A call(F, A, R)
ͭͷੜنଇΛࣔ͠·͢ɻ DBMMϊʔυ͔ΒDBMM੍Λੜ͠·͢ɻ ϊʔυͷܕ3ͱɺݺͼग़͞ΕΔؔͷܕ'ɺ༩͑ΔҾͷܕ"͔ΒɺDBMM ' " 3 ͱॻ͖·͢ɻ "45Λͦͷ··ॻ͖͚ࣸͨͩ͠ͷΑ͏ͳײ͡Ͱ͕͢ɺ ͜ͷΑ͏ʹ੍ͷܗʹ͢Δ͜ͱͰ͜ͷޙͷॲཧͰѻ͑ΔΑ͏ʹ͍ͯ͠·͢ɻ &YBNQMFPG(FOFSBUJOH$POTUSBJOUT WBSEFDMB DBMM EFDMSFGJE EFDMSFGJ $T1 $T2 ($T3) -> $T3 Int eq($T1, $T2) call(($T3) -> $T3, Int, $T2) ຊͬͱͨ͘͞Μͷ"45ϊʔυ੍ͷछྨ͕͋ΔͷͰ͕͢ɺ جຊΛཧղ͢Δ্Ͱ͜ΕͰेͰ͢ɻ ઌ΄Ͳྫʹग़ͨ͠"45͔Β੍ੜΛͯ͠Έ·͢ɻ !·ͣɺWBSEFDMϊʔυ͔ΒFR੍͕ੜ͞Ε·͢ɻ !࣍ʹɺDBMMϊʔυ͔ΒDBMM੍͕ੜ͞Ε·͢ɻ ! *OGFSFODF w 3FQFBUFEMZBQQMZJOHVOJ fi DBUJPOBOETJNQMJ DBUJPOUPUIFTFUPG DPOTUSBJOUT w 5IFQSPDFTTJTDPNQMFUFPODFUIFUZQFTPGBMMUZQFWBSJBCMFTIBWF CFFOEFUFSNJOFE ͦ͏ͨ͠Β͍Α͍ΑਪΛ͠·͢ɻ ͜Εɺ༻ҙ੍ͨ͠ू߹ʹରͯ͠ɺ ୯ҰԽͱ͍͏ૢ࡞ͱɺ ؆Խͱ͍͏ૢ࡞Λ܁Γฦ͢खଓ͖Ͱ͢ɻ ͜ͷաఔͰܕมͷܕ͕໌͍͖ͯ͠·͢ɻ
6OJGJDBUJPO w 'JOEFRVBMDPOTUSBJOUTGPSUZQFWBSJBCMFTBOESFQMBDFBMMUIFJSPDDVSSFODFT eq($T1, Int) eq($T2, ($T1) -> $T1) eq($T3,
($T1) -> $T2) eq($T1, Int) eq($T2, (Int) -> Int) eq($T3, (Int) -> $T2) eq($T1, Int) eq($T2, (Int) -> Int) eq($T3, (Int) -> (Int) -> Int) ·ͣ୯ҰԽͱɺܕมʹର͢ΔಉҰ੍Λݟ͚ͭɺ ͦΕʹج͍ͮͯଞͷग़ݱΛஔ͢Δ͜ͱͰ͢ɻ ྫΛࣔ͠·͠ΐ͏ɻ !͡ΊʹɺͭͷܕมͱͭͷಉҰ੍͕͋ͬͨͱ͠·͢ɻ ͜ͷ࣌Ͱɺ5ͷܕ۩ମతͳ*OUʹͳ͍ͬͯ·͕͢ɺ 5ͱ5ܕมΛؚΜͰ͍ͯΑ͘Θ͔Γ·ͤΜɻ ͜ΕΛղ͖·͢ɻ !·ͣɺ5ͷFR੍͔Βɺ͜Ε͕*OUܕͩͱΘ͔Γ·͢ɻ !ͦ͜Ͱଞͷ੍ʹؚ·ΕΔ5Λɺ !*OUʹஔ͠·͢ɻ ͜Ε͕୯ҰԽͰ͢ɻ ͔͜͜Β͞Βʹ͏Ұ୯ҰԽͰ͖·͢ɻ !5ʹ͍ͭͯͷ੍ΛݟΔͱɺ*OUΛड͚औΓ*OUΛฦؔͩ͢ͱ͔Γ·͢ɻ !ͦ͜Ͱଞͷ੍ͷதʹग़ݱ͢Δ5Λɺ !ͦΕʹஔ͠·͢ɻ !݁Ռͱͯͭ͠ͷܕมͷܕ͕શͯఆ·Γ·͢ɻ
4JNQMJGJDBUJPOPGFRVBMDPOTUSBJOUT eq(A?, B?) eq(A, B) 0QUJPOBMT eq((A) -> B, (C)
-> D) eq(B, D) eq(A, C) 'VODUJPOT eq((A, B), (C, D)) eq(B, D) eq(A, C) 5VQMFT ࣍ʹɺ؆Խͱ͍͏ͷɺ͋Δ੍Λͬͱ୯७ͳ੍ʹஔ͖͑Δ͜ͱͰ ͢ɻ ྫͱͯ͠ɺಉҰ੍ͷ؆ԽΛݟͯΈ·͠ΐ͏ɻ !͠ɺ͋ΔಉҰ੍͕λϓϧಉ࢜Λ͚͍ؔͯΔ࣌ɺ ͜ΕΛͦΕͧΕͷཁૉ͝ͱͷಉҰ੍ʹղ͢Δ͜ͱ͕Ͱ͖·͢ɻ ! ଞʹؔΦϓγϣφϧͳͲʹରͯ͠؆Խ͕Ͱ͖·͢ɻ 4JNQMJGJDBUJPOPGGVODUJPODBMMJOHDPOTUSBJOUT call((A) -> B, C, D) eq(B, D) eq(A, C) 1BSBNFUFST 3FUVSOWBMVF ؔݺͼग़੍͠ͷ؆ԽݟͯΈ·͠ΐ͏ɻ ܕ"Λड͚औͬͯܕ#Λฦؔ͢ʹରͯ͠ɺ ܕ$Λͨ݁͠Ռ͕ܕ%Ͱ͋Δɺ ͱ͚ؔΒΕ͍ͯͨͱ͠·͢ɻ ͦͷ߹ɺ͜ΕΛܕ"ͱܕ$ͷಉҰ੍ͱɺܕ#ͱܕ%ͷಉҰ੍ʹมͰ͖·
͢ɻ 5IFJOUFSQMBZCFUXFFOVOJGJDBUJPOBOETJNQMJGJDBUJPO call($T1, $T2, $T3) eq($T1, (Int) -> Bool) call((Int)
-> Bool, $T2, $T3) eq($T1, (Int) -> Bool) eq(Int, $T2) eq($T1, (Int) -> Bool) eq(Bool, $T3) ͦΕͰɺ୯ҰԽͱ؆ԽΛΈ߹ΘͤͯɺܕਪΛ͢ΔྫΛࣔ͠·͠ΐ͏ɻ !·ͣॳΊʹɺؔݺͼग़੍͠ͱಉҰ੍͕͋ͬͨͱ͠·͢ɻ !ؔݺͼग़੍͠ΛΈͯΈΔͱɺ ݺͼग़͞ΕΔࣜͷܕ͕ܕมʹͳ͍ͬͯͯɺ ઌ΄Ͳઆ໌ͨ͠Α͏ͳؔͷܗʹͳ͍ͬͯͳ͍ͨΊɺ ͜Ε؆ԽͰ͖·ͤΜɻ !ͱ͜Ζ͕ɺ͏ҰͭͷಉҰ੍؆୯ͳܗʹͳ͍ͬͯΔͷͰɺ !୯ҰԽ͢Δ͜ͱ͕Ͱ͖·͢ɻ !୯ҰԽ͢Δͱࠓɺؔݺͼग़੍͕ؔ͠ͷܗʹͳ͍ͬͯΔͷͰɺ؆ Խ͢Δ͜ͱ͕Ͱ͖·͢ɻ !
!࠷ऴతʹͭͷܕมͷܕ͕֬ఆ͠·͢ɻ ͜ΕͰਪ͕ྃͰ͢ɻ ! &YBNQMFPG*OGFSFODF 1SPCMFN4UBUFNFOU func id<X>(_ x: X) ->
X func main(i: Int) { let a = id(i) } WBSEFDMB DBMM EFDMSFGJE EFDMSFGJ $T1 $T2 ($T3) -> $T3 Int eq($T1, $T2) call(($T3) -> $T3, Int, $T2) ͦΕͰɺॳΊʹग़ͨ͠ίʔυͷਪΛΈ͍͖ͯ·͠ΐ͏ɻ ίʔυͱɺ"45ͱɺੜ੍ͨ͠Λ࠶ܝ͠·͢ɻ ͔͜͜Βɺ੍͚ͩΛѻ͍·͢ɻ &YBNQMFPG*OGFSFODF eq($T1, $T2) call(($T3) -> $T3, Int, $T2) eq($T1, $T2) eq($T3, Int) eq($T3, $T2) eq($T1, $T2) eq($T3, Int) eq(Int, $T2) eq($T1, Int) eq($T3, Int) eq(Int, $T2) !·ͣɺؔݺͼग़੍͠ΛΈͯΈ·͢ɻ ݺͼग़͞ΕΔؔͷܕʹܕมؚ͕·Ε͍ͯ·͕͢ɺؔͷܗ͍ͯ͠ΔͷͰ !؆ԽͰ͖·͢ɻ !࣍ʹɺ5ͷܕ͕Θ͔ͬͨͷͰɺ !͜ΕͰ୯ҰԽͰ͖·͢ɻ
!͜ΕͰ5ͷܕ͕Θ͔ͬͨͷͰɺ !୯ҰԽ͠·͢ɻ !͜ΕͰશ෦ͷܕมͷܕ͕ղ͚·ͨ͠ɻ ! eq($T3, Int) 7FSJGJDBUJPOPG*OGFSFODF3FTVMUT eq($T1, Int) eq(Int,
$T2) WBSEFDMB DBMM EFDMSFGJE EFDMSFGJ $T1 $T2 ($T3) -> $T3 Int Int Int (Int) -> Int func id<X>(_ x: X) -> X func main(i: Int) { let a = id(i) } ܕਪ͕ͪΌΜͱղ͚͍ͯΔ͜ͱΛ֬ೝ͠·͢ɻ ͭͷܕมݩʑ"45ʹׂΓͯΒΕ͍ͯΔͷͰɺ ίʔυͷରԠ͢ΔҐஔͷܕΛҙຯ͍ͯ͠·͢ɻ !5 !WBSEFDMϊʔυͷܕͳͷͰɺ !B͕*OUͩͱ͍͏ࣄͰ͢ɻ !5 !DBMMϊʔυͷܕͳͷͰɺ !JEΛݺͼग़ͨ͠ฦΓ*OUͩͱ͍͏ࣄͰ͢ɻ !5ʹΑΕɺ !JEؔͷδΣωϦοΫύϥϝʔλ9͕ɺ !*OUͩͱ͍͏ࣄͰ͢ɻ
!͜ͷΑ͏ʹίʔυͷܕ͕ͯ͢໌͍ͯ͠Δ͜ͱ͕Θ͔Γ·͢ɻ $PNQMFUJPOPG5ZQF*OGFSFODF w "MMUZQFWBSJBCMFTUZQFTBSFEFUFSNJOFEˠ5ZQFJOGFSFODFTVDDFTTGVM w $POUSBEJDUJPOPDDVSTˠ5IFDPEFJTJODPSSFDU w 6OLOPXOUZQFWBSJBCMFTSFNBJO CVUJOGFSFODFDBOOPUQSPDFFEˠ5IF DPEFTUZQFJTBNCJHVPVT
ܕਪͷऴྃʹ͍ͭͯઆ໌͠·͢ɻ શͯͷܕมͷܕ͕֬ఆͨ͠ΒɺܕਪޭͰ͢ɻ ్தͰҟͳΔܕಉ࢜ͷಉҰ੍͕ੜ͡ΔͳͲໃ६͕ൃੜͨ͠Βɺ ͦͷίʔυܕ͕ؒҧ͍ͬͯΔࣄ͕໌͠·͢ɻ ෆ໌ͳܕม͕͍ͬͯΔ͕ɺͦΕҎ্୯ҰԽ؆ԽͰ͖ͳ͘ͳͬͯ͠· ͏͜ͱ͕͋Γ·͢ɻ ͜Εɺίʔυͷܕ͕ᐆດͰ͋Δͱ͍͏͜ͱʹͳΓ·͢ɻ ͜ͷΑ͏ʹɺܕਪ͕ऴྃ͢Δͱ͖ɺ༷ʑͳ݁Ռ͕ಘΒΕ·͢ɻ
#JEJSFDUJPOBMJUZ func readInt() -> Int func read<X>() -> X func
main() { let a = readInt() let b: Int = read() } eq($T1, $T2) eq(Int, $T3) call(() -> $T4, $T4, $T3) call(() -> Int, (), $T2) ͷ࢝Ίʹɺਪʹํੑ͕ඞཁͩͱݴ͍·ͨ͠ɻ ͦΕ͕ຬͨ͞Ε͍ͯΔ͜ͱΛ֬ೝ͠·͠ΐ͏ɻ !Bͷࣜॱํͷਪ͕ඞཁͰɺ্ʹඳ͍ͨͭͷ੍Λੜ͠·͢ɻ !Cͷࣜٯํͷਪ͕ඞཁͰɺԼʹඳ͍ͨͭͷ੍Λੜ͠·͢ɻ ! ͲͪΒಉ͡Α͏ʹ୯ҰԽͱ؆ԽͰղ͘͜ͱ͕Ͱ͖·͢ɻ ੍ू߹ʹมͨ࣌͠Ͱɺ ίʔυͷํͱແؔʹͳ͍ͬͯΔͨΊɺ ࣗવͱํੑ͕࣮ݱͰ͖͍ͯΔͷͰ͢ɻ &YUFOTJPOTGPS4XJGU ͜͜·Ͱجຊతͳܕਪͷઆ໌Ͱͨ͠ɻ ͔͜͠͠Ε͚ͩͰɺ4XJGUͷݴޠػೳʹରԠ͖͠Ε·ͤΜɻ ͦͷͨΊʹɺܕਪ֦ு͢Δඞཁ͕͋Γ·͢ɻ
*OUSPEVDUJPOPGDPOWFSTJPOSFMBUJPOTBOENPEJGJDBUJPOPGBTTJHONFOU TUBUFNFOUDPOTUSBJOUT w 4XJGUIBTJNQMJDJUUZQFDPOWFSTJPOT func main(i: Int) { let a:
Int? = i } eq(Int?, Int) conv(Int, Int?) ❌ ✅ ͜͜·Ͱ҉ͷܕมΛແࢹ͍ͯ͠·ͨ͠ɻ ͔࣮ͦ͠͠ΕͰ͜ͷྫͷΑ͏ͳ؆୯ͳೖจ͢Βѻ͑·ͤΜɻ *OUͱ*OU ͷΑ͏ʹ྆ลͷܕ͕ҟͳΔ߹ʹɺಉҰ੍Λ࡞ͬͨ࣌Ͱໃ६͠ ͯ͠·͍·͢ɻ ͦ͜Ͱɺ҉ͷܕมʹରԠ͢ΔͨΊʹɺ ৽ͨʹม੍Λಋೖ͠·͢ɻ ม੍ɺҰͭͷܕΛೋͭͷܕʹมͰ͖ΔࣄΛҙຯ͠·͢ɻ ͜ͷྫͷΑ͏ʹɺೖจ͔Βม੍Λੜ͢ΔΑ͏ʹमਖ਼͠·͢ɻ 4JNQMJGJDBUJPOPG$POWFSTJPO$POTUSBJOUT conv((A) -> B, (C) -> D) conv(B, D) conv(C, A) 1BSBNFUFST 🙃DPOUSBWBSJBODF 3FUVSOWBMVFT 🙂DPWBSJBODF ม੍ಉҰ੍ͱࣅͨΑ͏ͳ؆Խ͕Ͱ͖·͢ɻ ྫ͑ɺؔಉ࢜ͷม੍ҾͱฦΓͷؔʹղͰ͖·͢ɻ
.PEJGJDBUJPOPGTJNQMJGJDBUJPOPGGVODUJPODBMMJOHDPOTUSBJOUT call((A) -> B, C, D) eq(B, D) conv(C, A)
1BSBNFUFST 🙃 3FUVSOWBMVFT ؔݺͼग़ؔ͠ͷ؆Խগ͠มΘΓ·͢ɻ Ҿʹ͍ͭͯม੍Λੜ͠·͢ɻ 1SPCMFNPG$POWFSTJPO$POTUSBJOUT func main(i: Int) { let a = i } conv(Int, $T1) 🤷 eq($T1, Int) eq($T1, Int?) eq($T1, Any) 0, 0, 0, ͯ͞ɺม੍ʹେ͖ͳ͕͋Γ·͢ɻ ؆ԽΛਐΊͯɺܕมͱܕͷ୯७ͳؔ·Ͱ౸ୡͯ͠ɺ ͦΕΛ୯ҰԽʹ͏͜ͱ͕Ͱ͖ͳ͍ͷͰ͢ɻ ͜ͷྫͰݴ͑ɺ 5*OU͔ΒมͰ͖ΔܕͩͱΘ͔͍ͬͯ·͕͢ɺ ۩ମత֬ఆ͍ͯ͠·ͤΜɻ *OU͔͠Εͳ͍͠ɺ*OU ͔͠Ε·ͤΜɻ"OZͰ͋Γ·ͤΜɻ Ͳ͏ͬͯਪΛਐΊΕྑ͍ͷͰ͠ΐ͏͔ɻ
(FOFSBUJPOBOE"UUFNQUPG6OJGJDBUJPO$BOEJEBUFT conv(Int, $T1) eq($T1, Int) QPTTJCJMF func main(i: Int) {
let a = i } func main(i: Int) { let a: Int = i } ͜ͷΑ͏ͳ໘Ͱɺܕਪث୯ҰԽީิͷੜͱࢼߦΛߦ͍·͢ɻ ཁ͢Δʹɺ͑ͷԾઆΛཱͯͯࢼ͠ʹղ͍ͯΈΔͷͰ͢ɻ ͦͯ͠ਪΛਐΊͯɺ࠷ऴతʹޭ͢ΕͦΕΛղͱͯ͠͠·͍·͢ɻ ྫ͑ม੍͕୯७ͳܗʹͳͬͨΒɺͦΕΛࢼ͠ʹಉҰ੍ʹஔ͖͑ͯ͠ ·͍·͢ɻ ͜ͷྫͰ͋Εɺ5Λ*OUʹԾఆͯ͠Έ·͢ɻ ͦͷ݁Ռͱͯ͠ಛʹى͜Βͳ͍ͷͰɺB͕*OUͰ͋Δͱ݁͠·͢ɻ &YBNQMFPG$BOEJEBUF4FBSDI conv($T1, Int?) conv(Int?, $T2) eq($T1, $T2) conv(Int, $T1) eq($T1, Int) eq($T1, Int?) eq($T2, Int?) ͪΖΜɺ͜ͷΑ͏ͳީิ͕͍ͭͰ͏·͍͘͘ͱݶΓ·ͤΜɻ ͜ͷΑ͏ͳͭͷ੍Λղ͘߹Λߟ͑ͯΈ·͠ΐ͏ɻ 5ʹ͍ͭͯͭɺ5ʹ͍ͭͯͭͷ୯ҰԽީิ͕ੜͰ͖·͢ɻ
&YBNQMFPG4FBSDI1MBO 4UBSU 5*OU 5*OU 5*OU 5*OU ͜ͷͭͷީิ͔Βɺ͜ͷΑ͏ͳ୳ࡧܭը͕ੜ͡·͢ɻ ॱ൪ʹݟͯΈ·͠ΐ͏ɻ 4UBSU 5*OU
5*OU 5*OU 5*OU conv($T1, Int?) conv(Int?, $T2) eq($T1, $T2) eq($T1, Int) conv(Int, Int?) conv(Int?, $T2) eq(Int, $T2) eq($T1, Int) conv(Int, Int?) conv(Int?, Int) eq(Int, $T2) eq($T1, Int) !Ծઆͱͯ͠ɺ5Λ*OUʹͯ͠Έ·͢ɻ !ͦͷಉҰ੍͔Β୯ҰԽͰ͖·͢ɻ !͢Δͱɺࠓ5ͷಉҰ੍͕Ͱ͖·ͨ͠ɻ !͞Βʹ୯ҰԽͯ͠Έ·͠ΐ͏ɻ !͢ΔͱͲ͏Ͱ͠ΐ͏ɺໃ६ͨ͠ม੍͕ग़ݱ͠·ͨ͠ɻ *OU ͔Β*OUʹมͰ͖·ͤΜɻ Αͬͯɺ͜ͷԾઆؒҧ͍ͩͬͨ͜ͱ͕Θ͔Γ·͢ɻ
4UBSU 5*OU 5*OU 5*OU 5*OU ❌ eq($T1, Int?) conv(Int?, $T2)
eq($T1, $T2) conv(Int, $T1) eq($T1, Int?) conv(Int?, $T2) eq(Int?, $T2) conv(Int, Int?) eq($T1, Int?) conv(Int?, Int?) eq(Int?, $T2) conv(Int, Int?) !ࠓ5Λ*OU ʹͯ͠Έ·͢ɻ !͜ͷಉҰ੍͔Β୯ҰԽ͕Ͱ͖·͢ɻ !5ͷಉҰ੍͕ग़ͯ͘ΔͷͰɺ !࠶ͼ୯ҰԽ͠·͢ɻ !͢Δͱɺશͯͷ੍ཱ͕͠ɺܕ͕ղ͚·ͨ͠ɻ )BOEMJOH0WFSMPBET func foo() -> Bool func foo() -> Int func foo() -> String func main(i: Int) { let a: Int = foo() } call($T1, (), Int) eq($T1, () -> Bool) eq($T1, () -> Int) eq($T1, () -> String) QPTTJCJMFY ͜ͷΑ͏ͳํ๏ʹΑͬͯɺΦʔόʔϩʔυʹରԠ͢Δ͜ͱ͕Ͱ͖·͢ɻ !DBMM੍Λੜ͢Δͱ͖ʹɺ ͦͷݺͼग़͠ର͕Φʔόʔϩʔυ͞Ε͍ͯͨΒɺ ؔͷܕΛ͍ͬͨΜܕมʹ͓͖·͢ɻ !ͦͯ͠ɺΦʔόʔϩʔυ͞Ε͍ͯΔؔΛͦͷܕมͷ୯ҰԽީิͱ͢ΔͷͰ ͢ɻ
"UUFNQUTBOE$PNQVUBUJPOBM$PNQMFYJUZ w 5IFNFDIBOJTNPGlBUUFNQUDBOEJEBUFTzIBTUIFQPUFOUJBMUPFYQMPEF JODPNQVUBUJPOBMDPNQMFYJUZ 💣 code.swift:11:9: error: the compiler is
unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions Ծઆͱͯ͠ީิΛཱͯͯɺͦΕΛࢼ͢ͱ͍͏ܕਪͷ֦ுʹ͍ͭͯઆ໌͠·͠ ͨɻ ͜ͷΑ͏ͳॲཧɺঢ়گʹΑͬͯɺܭࢉྔ͕രൃతʹ૿Ճͯ͠͠·͏͜ͱ͕ ͋Γ·͢ɻ ͜ͷΑ͏ͳίϯύΠϧΤϥʔϝοηʔδ͕දࣔ͞ΕΔ߹ɺͦΕ͕͍ؔͯ͠Δ ࣄ͕ଟ͍Ͱ͢ɻ -FBSOJOHGSPNUIF$PNQJMFS ͜͜·Ͱɺ4XJGUʹରԠ͢ΔͨΊʹܕਪΛ֦ு͢Δํ๏Λઆ໌͠·ͨ͠ɻ ࠷ޙʹɺܕਪͷಈ࡞ΛίϯύΠϥ͔ΒֶͿํ๏Λઆ໌͠·͢ɻ .BLJOHUIF$PNQJMFS0VUQVUUIF0QFSBUJPOTPG5ZQF*OGFSFODF $ swiftc -Xfrontend -debug-constraints code.swift func foo() -> Int { 0 } func foo() -> Bool { true } func main() { let a: Int = foo() } 0VUQVUFYDFFEJOHMJOFT🤯 4XJGUίϯύΠϥʹɺܕਪͷಈ࡞Λग़ྗͤ͞Δػೳ͕͋Γ·͢ɻ ͦΕʹίϚϯυϥΠϯͰɺ9GSPOUFOEͱEFCVHDPOTUSBJOUTͱ͍͏Φϓγϣ ϯΛ༩͑·͢ɻ ྫ͑͜ͷίʔυΛೖྗ͢ΔͱߦΛ͑Δग़ྗ͕ൃੜ͠·͢ɻ ͜ͷ༰ͷಡΈղ͖ํΛઆ໌͠·͢ɻ
*OGFSFODFQSPDFTT func foo() -> Int { 0 } func foo()
-> Bool { true } func main() { let a: Int = foo() } 4UBSU 5*OU 5 *OU 5 #PPM 4VDDFTT 'BJMVSF ग़ྗΛݟΔલʹɺ͜ͷίʔυͷਪखॱΛઆ໌͓͖ͯ͠·͢ɻ !Bʹ͍ͭͯͷೖจ͕͋ΔͨΊɺม੍͕ੜ͡·͢ɻ !͜Εʹ*OUͷܕ͕ࢦఆ͞Ε͍ͯΔͨΊɺީิͱͯ͠*OU͕ࢼߦ͞Ε·͢ɻ !·ͨɺGPPʹ͍ͭͯͷΦʔόʔϩʔυ͕͋ΔͨΊɺ !ͦΕͷީิ͕ࢼߦ͞Ε·͢ɻ !͢Δͱɺ*OUͷํޭ͠ɺ !#PPMͷํࣦഊ͢ΔͷͰɺ ࠷ऴతʹղ͕֬ఆ͠·͢ɻ ! $ swiftc -Xfrontend -debug-constraints code.swift ---Constraint solving at [code.swift:1:21 - line:1:21]--- (…) ---Constraint solving at [code.swift:2:22 - line:2:22]--- (…) ---Constraint solving at [code.swift:5:9 - line:5:22]--- (…) func foo() -> Int { 0 } func foo() -> Bool { true } func main() { let a: Int = foo() } 0VUQVUGPSUIF&OUJSF$PEF ͦΕͰίϯύΠϥͷग़ྗΛݟ͍͖ͯ·͠ΐ͏ɻ !ग़ྗ͜ͷΑ͏ͳݟग़͠Ͱେ·͔ʹ۠ΒΕ͍ͯ·͢ɻ ܕਪίʔυશମΛҰʹղ͘Θ͚Ͱͳ͘ɺ ࣜ͝ͱʹॲཧ͢ΔͨΊɺ ҰͭͷίʔυͷதͰԿճ࣮ߦ͞ΕΔ͔ΒͰ͢ɻ
!ࠓBͷॳظԽจΛௐ͍ͨͷͰɺ ͜ͷ෦ͷߦ൪߸ͷදࣔΛݟͯɺ ͭͷηΫγϣϯΛݟ͍͖ͯ·͢ɻ 0VUQVUGPS*OEJWJEVBM*OGFSFODFT ---Constraint solving at [code.swift:5:9 - line:5:22]---
---Initial constraints for the given expression--- (Initial State of the AST) (Initial State of the Constraints) (Inference Process) ---Solution--- (Solution) ---Type-checked expression--- (Typed AST) ݸผͷਪͷग़ྗͷߏΛࣔ͠·͢ɻ ·ͣɺ*OJUJBMDPOTUSBJOUTGPSUIFHJWFOFYQSFTTJPOͱ͍͏ݟग़͕͋͠Γɺ ͦ͜ʹ"45ͷॳظঢ়ଶɺ੍ͷॳظঢ়ଶ͕ଓ͖·͢ɻ ͦͷ··ɺਪաఔͷग़ྗ͕ଓ͖·͢ɻ ͦͷޙΖʹɺ4PMVUJPOͱ͍͏ݟग़͕͋͠Γɺਪͷղ͕දࣔ͞Ε·͢ɻ ࠷ޙʹɺ5ZQFDIFDLFEFYQSFTTJPOͱ͍͏ݟग़͕͋͠Γɺ ܕ͚͞Εͨ"45͕ग़ྗ͞Ε·͢ɻ *OJUJBM4UBUFPGUIF"45 ---Initial constraints for the given expression— (call_expr type='$T1' location=code.swift:5:18 range=[code.swift:5:18 - line:5:22] isolationCrossing=none (overloaded_decl_ref_expr type='$T0' location=code.swift:5:18 range=[code.swift:5:18 - line:5:18] name=foo number_of_decls=2 function_ref=single decls=[ code.(file).foo()@code.swift:1:6, code.(file).foo()@code.swift:2:6]) (argument_list)) let a: Int = foo() DBMM EFDMSFGJE $T0 $T1 ·ͣ"45ͷॳظঢ়ଶͰ͢ɻ "45ͷϊʔυߏؙׅހΛͬͯදݱ͞Ε·͢ɻ "45ͱίʔυͷҐஔͱͷରԠؔɺMPDBUJPOSBOHFͷใ͔ΒΘ͔Γ·͢ɻ !·ͣɺGPPͷݺͼग़͠ʹରԠ͢ΔDBMM@FYQSϊʔυ͕͋Γ·͢ɻ ͜ͷࣜͷܕ͕5ͱ͍͏ܕมʹׂΓͯΒΕ͍ͯ·͢ɻ
!·ͨɺGPPͷࢀরʹରԠ͢ΔɺPWFSMPBEFE@EFDM@SFG@FYQSϊʔυ͕͋Γ· ͢ɻ ͜ͷࣜͷܕ5ͱ͍͏ܕมʹׂΓͯΒΕ͍ͯΔ͜ͱ͕Θ͔Γ·͢ɻ *OJUJBM4UBUFPGUIF$POTUSBJOUT Score: <default 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0> Contextual Type: Int at [code.swift:5:12 - line:5:12] Type Variables: $T0 [allows bindings to: lvalue, noescape] [attributes: delayed] [with possible bindings: <empty>] @ locator@0x11b81ac00 [
[email protected]
:5:18] $T1 [allows bindings to: noescape] [attributes: delayed] [with possible bindings: (subtypes of) Int] @ locator@0x11b81adb0 [
[email protected]
:5:18 → function result] $T2 as Int @ locator@0x11b81aef0 [
[email protected]
:5:18 → contextual type → pattern match → pattern match → named pattern decl] Inactive Constraints: disjunction @ locator@0x11b81ac00 [
[email protected]
:5:18]: > $T0 bound to decl code.(file).foo()@code.swift:1:6 : () -> Int > $T0 bound to decl code.(file).foo()@code.swift:2:6 : () -> Bool () -> $T1 applicable fn $T0 @ locator@0x11b81ae30 [
[email protected]
:5:18 → apply function] $T1 conv Int @ locator@0x11b81aec8 [
[email protected]
:5:18 → contextual type] ੍ͷॳظঢ়ଶΛݟ͍͖ͯ·͠ΐ͏ɻ ͨ͘͞Μͷใ͕͋ΔͷͰɺॏཁͳͱ͜ΖΛൈਮ͠·͢ɻ !·ͣɺ$POUFYUVBM5ZQFͰ͢ɻ ͜Εࠓղ͜͏ͱ͍ͯ͠Δࣜʹ͔͔͍ͬͯΔࠨลͷܕͰ͢ɻ ࠓճͷίʔυͰɺࠨลͷมʹ*OU͕ܕࢦఆ͞Ε͍ͯΔͷͰɺͦͷใ͕දࣔ ͞Ε͍ͯ·͢ɻ !࣍ʹɺ5ZQF7BSJBCMFTͰ͢ɻ ͜ͷηΫγϣϯʹɺܕมͷҰཡ͕දࣔ͞Ε·͢ɻ !ઌ΄Ͳ"45ʹׂΓͯΒΕ͍ͯͨɺ5ͱ5͕දࣔ͞Ε͍ͯ·͢ɻ !·ͨɺઌ΄Ͳઆ໌ͨ͠$POUFYUVBM5ZQF͕5ͱͯ͠දࣔ͞Ε͍ͯ·͢ɻ ͜Εطʹܕ͕*OUʹ֬ఆͨ͠ঢ়ଶͰ͢ɻ !࣍ʹɺ*OBDUJWF$POTUSBJOUTͰ͢ɻ ͜Ε੍͕ͷू߹ͷ͜ͱͰ͢ɻ
!·ͣɺEJTKVODUJPO͕͋Γ·͢ɻ ͜ΕGPPͷΦʔόʔϩʔυΛબ͢ΔλεΫ੍͕ͱͯ͠දݱ͞Ε͍ͯ·͢ɻ !EJTKVODUJPO੍ͷଐใͱͯ͠ɺ ͦͷީิͷΦʔόʔϩʔυؚ͕ͭ·Ε͍ͯ·͢ɻ ͜ΕGPPͷܕΛද͢ܕม5ʹର͢ΔׂΓ੍ͯͱͯ͠දݱ͞Ε͍ͯ·͢ɻ !࣍BQQMJDBCMFGO੍Ͱ͢ɻ ͜͜·ͰDBMM੍ͱͯ͠આ໌͍ͯͨ͠ͷͰɺ ܕม5Λݺͼग़͢ͱܕม5͕ಘΒΕΔͱ͍͏ࣄΛҙຯ͍ͯ͠·͢ɻ !࠷ޙʹDPOW੍Ͱ͢ɻ 5͕*OUʹมͰ͖Δͱ͍͏ࣄͰ͢ɻ
*OGFSFODF1SPDFTT (attempting type variable binding $T1 := Int ... (attempting disjunction choice $T0 bound to decl code. (file).foo()@code.swift:1:6 : () -> Int @ locator@0x11b81ac00 [
[email protected]
:5:18] ... (found solution: <default 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0>) ) (attempting disjunction choice $T0 bound to decl code. (file).foo()@code.swift:2:6 : () -> Bool @ locator@0x11b81ac00 [
[email protected]
:5:18] ... (outcome: error) ) ) 4UBSU 5*OU 5 *OU 5 #PPM 4VDDFTT 'BJMVSF ࣍ʹɺਪաఔΛݟ͍͖ͯ·͠ΐ͏ɻ ߦ͕ଟ͍ͷͰॏཁͳͱ͜ΖΛൈਮ͍ͯ͠·͢ɻ !·ͣɺ಄ʹBUUFNQUJOHUZQFWBSJBCMFCJOEJOHͱॻ͍ͯ͋Γ·͢ɻ ͜͜Ͱɺ5Λ*OUʹ͢ΔࣄΛࢼߦ͍ͯ͠·͢ɻ !ͦͷதʹωετ͞Εͨߏͱͯ͠ɺ
BUUFNQUJOHEJTKVODUJPODIPJDF͕ͭ͋Γ·͢ɻ ͜ΕɺͭͷΦʔόʔϩʔυͷͦΕͧΕΛࢼߦ͍ͯ͠ΔذΛҙຯ͍ͯ͠· ͢ɻ !*OUΛฦ͢GPPΛࢼߦͨ͠ύλʔϯʹ͍ͭͯɺ ωετ͞Εͨग़ྗͷதʹGPVOETPMVUJPO͕͋Γ·͢ɻ ͜Ε͕ɺਪ͕ޭͨ͠ࣄΛ͍ࣔͯ͠·͢ɻ 4PMVUJPO ---Solution--- Fixed score:
<default 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0> Type variables: $T0 as () -> Int @ locator@0x11b81ac00 [
[email protected]
:5:18] $T1 as Int @ locator@0x11b81adb0 [
[email protected]
:5:18 → function result] $T2 as Int @ locator@0x11b81aef0 [
[email protected]
:5:18 → contextual type → pattern match → pattern match → named pattern decl] Overload choices: locator@0x11b81ac00 [
[email protected]
:5:18] with code. (file).foo()@code.swift:1:6 as foo: () -> Int Trailing closure matching: locator@0x11b81afe8 [
[email protected]
:5:18 → apply argument]: forward ղͷग़ྗ෦Ͱ͢ɻ ੍ͷॳظঢ়ଶͱࣅͨΑ͏ͳܗࣜͰදࣔ͞Ε͍ͯ·͢ɻ !ܕม5ɺ5ɺ5ͷܕ͕දࣔ͞Εɺ ܕਪ͕͍ྃͯ͠Δ͜ͱ͕Θ͔Γ·͢ɻ 5ZQFE"45 ---Type-checked expression--- (call_expr type=‘Int' location=code.swift:5:18 range=[code.swift:5:18 - line:5:22] isolationCrossing=none (declref_expr type='() -> Int’ location=code.swift:5:18 range=[code.swift:5:18 - line:5:18] decl=code.(file).foo()@code.swift:1:6 function_ref=single) (argument_list)) let a: Int = foo() DBMM EFDMSFGJE () -> Int Int ࠷ޙʹɺܕ͚͞Εͨ"45ͷग़ྗͰ͢ɻ !DBMM@FYQSͷܕมஔ͞Εͯɺ۩ମతͳ*OUܕʹͳ͍ͬͯ·͢ɻ !·ͨɺPWFSMPBEFE@EFDM@SFG@FYQSϊʔυEFDMSFG@FYQSϊʔυʹஔ͞Εɺ ܕ*OUΛฦؔ͢ʹͳ͍ͬͯ·͢ɻ !
Ҏ্ͰίϯύΠϥͷग़ྗͷઆ໌ऴΘΓͰ͢ɻ օ͞Μ༷ʑͳίʔυͷܕਪͷಈ࡞ΛௐͯΈ͍ͯͩ͘͞ɻ 3FDBQ w 5IFCBTJDTPGUZQFJOGFSFODFBSFVOJ DBUJPOBOETJNQMJ DBUJPOPG DPOTUSBJOUT w 4XJGUFYUFOETJUCZBEEJOHTFBSDIUPUIFQSPDFTT
w 8FDBOVOEFSTUBOEJUTPQFSBUJPOTCZMPPLJOHBUUIFDPNQJMFSTPVUQVU ·ͱΊ·͢ɻ ͡ΊʹܕਪͷجຊΛઆ໌͠·ͨ͠ɻ ͦΕɺ੍ू߹ʹର͢Δ୯ҰԽͱ؆Խͷ܁Γฦ͠ͷखଓ͖Ͱͨ͠ɻ ͦͯ͠ɺ4XJGUʹରԠ͢ΔͨΊͷ֦ுͱͯ͠ɺ୳ࡧΛՃ͑ΔࣄΛઆ໌͠·ͨ͠ɻ ࠷ޙʹɺίϯύΠϥͷग़ྗΛݟͯͦͷಈ࡞ΛΔํ๏Λઆ໌͠·ͨ͠ɻ /FYU4UFQT w JNQMFNFOUJOHUZQFJOGFSFODF https://stackoverflow.com/questions/415532/implementing-type- inference w 5ZQF$IFDLFS%FTJHOBOE*NQMFNFOUBUJPO https://github.com/apple/swift/blob/main/docs/TypeChecker.md w 4XJGU5ZQF*OGFSFODF)BOET0O https://github.com/omochi/SwiftTypeInferenceHandsOn w $PNQJMJOH4XJGUHFOFSJDT 1BSU* https://forums.swift.org/t/compiling-swift-generics-part-i/60898 ࠷ޙʹɺ͞Βʹৄֶ͘͠ͿͨΊͷใΛհ͠·͢ɻ ͭͷϦϯΫઌͰɺܕਪΛֶश͢ΔͨΊͷࢿྉ͕ଟ͘հ͞Ε͍ͯ·͢ɻ ࢲ͜ΕΛಡΈ·ͨ͠ɻ ͭͷϦϯΫઌɺ4XJGUίϯύΠϥͷܕਪʹ͍ͭͯͷެࣜͷจॻͰ͢ɻ ͭͷϦϯΫઌɺࢲ͕4XJGUͰ࣮ͨ͠ɺ4XJGUͷܕਪͷίʔυͰ͢ɻ ͭͷϦϯΫઌɺ4XJGUίϯύΠϥ։ൃऀͷ4MBWB͞Μ͕ࣥචதͷɺܕγες
ϜͷղઆॻͰ͢ɻ ࠓͷͰڵຯΛ࣋ͬͨਓɺͥͻ͜ΕΒνΣοΫ͍ͯͩ͘͠͞ɻ Ҏ্ͰࢲͷൃදΛऴΘΓ·͢ɻ ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ