Closed13
わいわいswiftc #1(前半〜55分くらいまで)を見ながらメモ
多相性: プログラムを異なる文脈では異なる型として用いることを可能とする各種言語機能
swiftでは型推論を使ってポリモーフィズムを実現している。
Swiftにおける(ローカル)型推論
- 型が明示されていないところに型変数(Type Variable)をおく
- 型変数の制約(Constraint)を生成する
- 制約を解く
Xcode 15でこれが動かない
swift -frontend -typecheck -debug-constraints ./test.swift
がこれで一旦
swift -frontend -typecheck -debug-constraints -sdk $(xcrun --show-sdk-path --sdk macosx) ./test.swift
複数の比較対象があるときにスコアで比較する。低いほうが良い
Potential Bindingで何も情報が無い場合に発生する型は決まっている。何もない場合はIntになるなど
Swiftにおいて、TはOptional<T>のサブタイプか?
答え。サブタイプ
参考: SwiftのOptionalサブタイピングが抱える闇
これはT_iがU_iのサブタイプなら、T_i…はU_i…のサブタイプであるという規則らしい
// T_i $< U_i ===> (T_i...) $< (U_i...)
swiftで $< はサブタイプ関係を示す
このfor部分の読み方は..
$<
はサブタイプを意味するが、
<
サブタイプ
<c
変換関係でもあるし、
<oc oc
でもある。という読み方。
// for $< in { <, <c, <oc }:
// T_i $< U_i ===> (T_i...) $< (U_i...)
サブタイプ関係があって型チェックが通っても、変換処理を挟まないといけないケースが普通にある。
どの制約で型チェックを通したか記録して..
それを元にASTを書き換えるときに挿入する
このケースでは対応する型強制は「.someで包む」
canTypeというのは、色々な書き方ができる型(例: [Array]など)、その表記ゆれを正規化してカノニカルにした型。カノニカルの略でcan。
このスクラップは2023/10/05にクローズされました