Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
[スクリプト] Swiftの型推論を学ぼう
Search
omochimetaru
March 23, 2024
Programming
530
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
300
型推論のちょっと深い話
omochi
1
540
Swiftの型推論を学ぼう | Let's Learn About Type Inference in Swift
omochi
4
11k
Swift6のprotocol
omochi
6
1.4k
SwiftSyntaxをうまく使おう
omochi
2
420
今から使えるSwiftとC++の新しいinterop手法
omochi
0
510
CSFixとラベルマッチ
omochi
0
470
Swiftのmodifyアクセサとコルーチン
omochi
0
930
Swiftのオーバーロード選択のスコア規則12種類
omochi
3
530
Other Decks in Programming
See All in Programming
Spring Security 実践 ─ GraphQL APIで実務に役立つ 認証・認可 を学ぶ
wagyu
0
220
CSC307 Lecture 17
javiergs
PRO
0
320
並列実装の現場、2ヶ月間実務でAIを使い倒したAIもPCも私も限界が近い
ming_ayami
0
130
「AIで開発し、AIを届ける」をEvalでつなぐ 〜AIネイティブに始めるプロダクト開発の実践〜 / Connecting "Develop with AI, deliver AI" with Eval
rkaga
4
5k
Vue × Nuxt × Oxc どこまで使える?実運用の現在地
andpad
0
240
フロントエンドとバックエンドで「1文字」を揃えよう
youkidearitai
PRO
0
420
AIとASP.NET Coreで雑Webアプリを作った話
mayuki
0
520
脅威をエンジニアリングの糧にして――現場編 / Turning Threats into Engineering Fuel — Field Edition
nrslib
0
270
メソッドのジェネリクスでGoの夢は広がるか? / Kyoto.go #65
utgwkk
3
730
DynamoDBには集計系のクエリがないけどなんとかしたい
musan
1
140
Lessons from Spec-Driven Development
simas
PRO
0
180
LLM本来の能力を解き放つサンドボックス技術とAI民主化への適用
yukukotani
3
3.7k
Featured
See All Featured
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.5k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.3k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
200
How to make the Groovebox
asonas
2
2.2k
Design in an AI World
tapps
1
240
Embracing the Ebb and Flow
colly
88
5.1k
What does AI have to do with Human Rights?
axbom
PRO
1
2.2k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
160
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
23k
Become a Pro
speakerdeck
PRO
31
6k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.3k
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͞Μ͕ࣥචதͷɺܕγες
ϜͷղઆॻͰ͢ɻ ࠓͷͰڵຯΛ࣋ͬͨਓɺͥͻ͜ΕΒνΣοΫ͍ͯͩ͘͠͞ɻ Ҏ্ͰࢲͷൃදΛऴΘΓ·͢ɻ ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ