sequences.map { $0.first }
<T: Collection>(_ x: T) -> T.Element
(edited)<A>(A) -> B
を考えると<A>(A) -> <B>B
かもしれないんですけどstruct
に対するメンバの typealias
しかない。<A>A
が多相なので<A>
に与えられる実際の型を規定するのが、protocol
だと思う。<A>(A) -> <B>B
は protocol AP { associatedtype R }
なときに、 <A: AP>(A) -> R
な式が持ってる型。$0
って書いた時点でもうなんらかの T
としてのコンパイルになっちゃってクロージャも (T) -> U
になるけど、 そうじゃなくて <A: P>(A) -> U
のほうにならないといけない。$0.first
は、 $0
の型がわかっている(<A>(A) -> B
の A
が特定できる)ときには、 .first
の型が静的にわかるけどそれは、 .first
の associatedtype
を与えているprotocolがあって、それを個別の A
が充足してる typealias
が静的に見えるから、です。x.y
の形の式に対して、 x
の型があるプロトコルで制約されていて、 y
がそのプロトコルのメンバなのであれば、 x.y
は静的に具体的な型が決定できる式、って事になりそう。x
だけのときは <A>(A) -> A
まあつまり <Self>(Self) -> Self
として同じことが言える。<A>(A) -> B
の B
が <A>
を充足する個別の T
に対して静的に解決できる型の場合と <A>
に入る T
がなんであろうが固定の型になっちゃう場合 ( description($0)
など )がある。<A>(A) -> <B>B
と <A>(A) -> B
の違いなんじゃないか??<A>(A) -> B
を与えたらそりゃ結果は (B, B, B, ...)
でしか無いはずなので。