Я хотел бы выразить протокол Swift, похожий на следующие два фрагмента, которые оба не компилируются.
Попытка 1:
protocol AbstractFunction {
associatedtype Domain
associatedtype Codomain
func apply(_ x: Domain) -> Codomain
static var identity: Self where Domain == Codomain { get }
}
Попытка 2:
protocol AbstractFunction {
associatedtype Domain
associatedtype Codomain
func apply(_ x: Domain) -> Codomain
static func identity() -> Self where Domain == Codomain { get }
}
Первое даже недействительно в грамматике Свифта, а второе не работает с
'where' clause cannot be attached to a non-generic declaration
.
Оба эти примера пытаются выразить протокол, который описывает функции, которые не являются экземплярами фактического типа функции (A) -> B
. Если у вас есть типы Vector2
и Vector3
, можно представить создание типов Matrix2x2
, Matrix2x3
и Matrix3x3
и их соответствие протоколу AbstractFunction
. Домен MatrixNxM
будет VectorM
, а кодомен будет VectorN
. Квадратные матрицы имеют тождественную матрицу, но концепция тождественной матрицы (или действительно тождественной функции) не имеет смысла, когда домен и кодомен различаются.
Следовательно, я бы хотел, чтобы протокол AbstractFunction
требовал соответствия типов для обеспечения идентичности, но только в случае, когда Domain == Codomain
. Это возможно?