«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Может ли Contravariance решить GO 1.18 \ 'Generic Type Проблема совместимости типа в функции трубы?

Может ли Contravariance решить GO 1.18 \ 'Generic Type Проблема совместимости типа в функции трубы?

Опубликовано в 2025-05-01
Просматривать:189

Can Contravariance Solve Go 1.18\'s Generic Type Compatibility Issue in the Pipe Function?

Contravariant Tipes в Go 1.18 Generics

В GO 1.18, генерические типы позволяют определять функции с типами, которые различаются в зависимости от аргументов типов. Contravariance, определенный тип дисперсии, позволяет функциям принимать более широкий диапазон типов ввода при сохранении четко определенной связи между типами ввода и вывода. Он ожидает, что выходной тип левой функции соответствует типу ввода правой функции. Однако в следующем примере он не может компилировать:

func pipe [a, t1, t2 any] (левый фонд (a) t1, правый фанк (t1) t2) func (a) t2 { вернуть фонд (а) t2 { вернуться вправо (слева (а)) } } func openfile (name string) *os.file { ... } Func Readall (rdr io.reader) [] byte { ... } var OpenRead = pipe (openfile, perthall) ] компилятор жалуется, потому что T1 считается *os.file, даже если он совместим с io.reader.

есть решение? поведение. Go не поддерживает типы ковариатных результатов, что означает, что выходной тип функции не может варьироваться в зависимости от типа ввода.
func Pipe[A, T1, T2 any](left func(A) T1, right func(T1) T2) func(A) T2 {
    return func(a A) T2 {
        return right(left(a))
    }
}

func OpenFile(name string) *os.File {
    ...
}

func ReadAll(rdr io.Reader) []byte {
    ...
}

var OpenRead = Pipe(OpenFile, ReadAll)

это ошибка? Это по дизайну, как объяснено в FAQ для Go Generics.

WorkParnound

для решения этого ограничения может использоваться модифицированная версия трубы [A, T-tope-type-type:

func [a, t1, t2, t3, t3, T3, t3, t3, t3, t3, t3 func (t2) t3) func (a) t3 { вернуть фонд (a a) t3 { Вернуть вправо (любой (слева (a)). (T2)) } } ]

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3