Я определяю два объекта:
data class ParserK с пометкой @higherkindinterface 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
Вот что я обнаружил:
@higherkind из класса данных ParserK и скопирую сгенерированные исходники в тот же файл, где определен ParserK, я смогу увидеть сгенерированный код функтора.Мне кажется это баг, поправьте меня, если я не прав, пожалуйста
ОБНОВЛЕНО:
@AleksandarDimitrov, мы нашли решение проблемы, не стесняйтесь проверять репозиторий на наличие ссылок.


(Для стрелки версии 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. То есть в будущих релизах эта проблема будет решена.
У меня точно такая же проблема. Вы сообщили о проблеме со arrow-kt?