Avatar
omochimetaru 1/27/2020 9:51 AM
// これは展開できるから良いとして func f1(_ tpl: ([Int], [String])) { let fst: (Int?, String?) = tpl.map { $0.first } } // これもジェネリック型のまま展開できる func f2<T, U>(_ tpl: ([T], [U])) { let fst: (T?, U?) = tpl.map { $0.first } } // でもその変換が外部から来たら展開できない、こうか? func f3(_ tpl: ([Int], [String]), _ g: <A>(A) -> <B> B) { // #decltypeはC++からアイデアを借用 let fst: (#decltype(g(tpl.0)), #decltype(g(tpl.1)) = tpl.map(g) } // これもこう? func f4<T, U>(_ tpl: ([T], [U]), _ g: <A>(A) -> <B> B) { let fst: (#decltype(g(tpl.0), #decltype(g(tpl.1)) = tpl.map(g) } (edited)
9:53 AM
↑やっぱりmapに渡すクロージャの型は、リバースジェネリクスが含まれませんかね? <B> が前にあるとしたら、呼び出し側が決定するわけだけど、 実際g の実装が $0.first なのか description($0) なのかわからないという立場だから、 f3f4 からすると、 <B> のパラメータは指定できない。 (edited)