Невозможно создать объекты как для @higherkind, так и для @extension

Я определяю два объекта:

  1. data class ParserK с пометкой @higherkind
  2. interface ParserKFunctor с пометкой @extension

Вот код:

@higherkind
data class ParserK<A>(val f: (String) -> Option<A>): ParserKOf<A> {
    companion object
}

@extension
interface ParserKFunctor : Functor<ForParserK> {
    override fun <A, B> Kind<ForParserK, A>.map(f: (A) -> B): Kind<ForParserK, B> {
        ...
    }
}

Когда я выполняю ./gradlew :app:kaptKotlin, я получаю:

error: "Arrow's annotations can only be used on Kotlin classes". Not valid for error.NonExistentClass

> Task :app:kaptGenerateStubsKotlin

> Task :app:kaptKotlin FAILED
e: error: Arrow's annotations can only be used on Kotlin classes. Not valid for error.NonExistentClass                                           

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:kaptKotlin'.
> Compilation error. See log for more details

Вот что я обнаружил:

  1. Если я удалю определение функтора, цель будет успешно завершена, и я смогу увидеть сгенерированный код.
  2. Если я удалю @higherkind из класса данных ParserK и скопирую сгенерированные исходники в тот же файл, где определен ParserK, я смогу увидеть сгенерированный код функтора.

Мне кажется это баг, поправьте меня, если я не прав, пожалуйста

ОБНОВЛЕНО:

  1. Вот ссылка на репозиторий с моим кодом: хранилище
  2. Проблема в системе отслеживания ошибок: здесь.

У меня точно такая же проблема. Вы сообщили о проблеме со arrow-kt?

Aleksandar Dimitrov 03.05.2019 14:48

@AleksandarDimitrov, мы нашли решение проблемы, не стесняйтесь проверять репозиторий на наличие ссылок.

neshkeev 30.06.2019 18:12
Gradle за прокси-сервером
Gradle за прокси-сервером
Создайте проект Gradle под сетевым прокси.
"DevOps: Jenkins & AWS Series, часть 5: Установка Gradle на Ubuntu 22.04
"DevOps: Jenkins & AWS Series, часть 5: Установка Gradle на Ubuntu 22.04
В этой статье блога мы проведем вас через процесс установки Gradle на Ubuntu 22.04, интеграции его с Jenkins и создания задания Gradle. Мы...
1
2
260
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

(Для стрелки версии 0.9.1-SNAPSHOT и ранее)

Процессор высшего порядка и процессоры расширения имеют зависимость. Правильно, аннотация расширения зависит от кода, сгенерированного аннотацией более высокого уровня. Зачем проверять этот связь.

Вкратце: всякий раз, когда вы пытаетесь реализовать классы типов, компилятору нужны типы высшего порядка вашего типа данных.

@extension
interface ListKFunctor : Functor<ForListK> {
//                                ^^^^^^^^
//                    This exists after building your module
  override fun <A, B> Kind<ForListK, A>.map(f: (A) -> B): Kind<ForListK, B> {
    return this.fix().map(f)
  }
}

Самый простой ответ на этот вопрос:

Always separate your Higherkinded Types from your typeclass definitions.

Но Arrow экспериментирует с другими вариантами Codegen. То есть в будущих релизах эта проблема будет решена.

Другие вопросы по теме