Avatar
protocol HTraverse { associatedtype Source: HList func traverse(_ f: () -> Void) -> HNil } extension HCons: HTraverse where T: HTraverse { typealias Source = HCons<H, T> // おい!ここを@inlinableにさせてくれ!! func traverse(_ f: () -> Void) -> HNil { f() return self.tail.traverse(f) } } extension HNil: HTraverse { typealias Source = HNil public func traverse(_ f: () -> Void) -> HNil { f() return HNil() } } 👆 こういう感じでHListHNil まで型レベルで再帰していくことによって、たとえば HCons<String, HCons<Bool, HCons<Bool, HCons<Int, HCons<Optional<Int>, HCons<String, HCons<Bool, HCons<Bool, HCons<Int, HCons<Optional<Int>, HNil>>>>>>>>>> このように10回HCons がネストした型だと10回の違った(1つずつ展開された)呼び出され型がするため、その分の特殊化(?)でバイナリサイズが爆弾になることを期待してたんですが、コメントにあるとおり、狙った場所に @inlineable を書くとコンパイルがとおらない…… 😢
8:17 PM
Ideone is something more than a pastebin; it's an online compiler and debugging tool which allows to compile and run code online in more than 40 programming languages.