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, ...) でしか無いはずなので。