эмуляция параметров типа метода в generi c go - PullRequest
0 голосов
/ 18 июня 2020

Посмотрев доклад Филипа Вадлера о полулегком весе go, я был очень взволнован новейшим go драфтом дженериков . Но теперь, когда мы можем поиграть с версией нового проекта дженериков, кажется, что некоторые вещи из полулегкого go больше невозможны. И в talk , и в paper он вводит функциональный интерфейс, называемый List. Подход из статьи не совсем работает.

type Any interface {}

type Function(type a Any, b Any) interface {
    Apply(x a) b
}

type Functor interface {
   Map(f Function) Functor
}

завершается с ошибкой: cannot use generic type Function(type a, b) without instantiation

и если вы попытаетесь добавить параметры типа к методу и использовать обычный функция, которую вы получите: methods cannot have type parameters

Интересно, нашел ли кто-нибудь способ заставить функторы работать с текущей версией черновика.

1 Ответ

1 голос
/ 18 июня 2020

Вы не пронесли общие c типы; в вашем примере кода Functor обрабатывает Function, как если бы он не был generi c. Правильный код (который компилируется, см. Здесь ) будет:

type Function(type a Any, b Any) interface {
    Apply(x a) b
}

type Functor(type a Any, b Any) interface {
   Map(f Function(a,b)) Functor(a,b)
}
...