Можно ли использовать вложенный тип вида со стрелкой? вид > - PullRequest
0 голосов
/ 02 мая 2020

Я не знаю, возможны ли типы гнезд, как я пытаюсь сделать:

Вот упрощенный код проблемы

Интерфейс

interface GroupRepository<T, F> {
   fun save(): Kind<T, Group>
   fun findAll() Kind<F, Group>
}

Реализация

class GroupRepositoryJpa(): GroupRepository<ForIO, IO<ForPage>> {

   override fun findAll(): IO<PageK<Group>> {
       val groups : Page<Group> = ...
       return IO { groups.k() }
   }
}

PageK.kt

class ForPageK private constructor() { companion object }
typealias PageKOf<A> = Kind<ForPageK, A>

@Suppress("UNCHECKED_CAST", "NOTHING_TO_INLINE")
inline fun <A> PageKOf<A>.fix(): PageK<A> = this as PageK<A>

data class PageK<A>(val page: Page<A>) : PageKOf<A>, Page<A> by page

fun <A> Page<A>.k(): PageK<A> = PageK(this)


При реализации функции findAll, когда Я пытаюсь вернуть IO<PageK<Group>>, компилятор сообщает мне Return type is 'IO<PageK<Group>>', which is not a subtype of overridden

Проблема в том, что я пытаюсь указать параметризованный интерфейс с Kind<F, Group>, но в этом случае результат должен быть

IO -> PageK -> Group

, что отличается от того, что нужно компилятору

(IO) -> Group.

Есть ли способ достичь того, что я пытаюсь делать?

Заранее спасибо

ОБНОВЛЕНИЕ

В конце я сделал

Интерфейс

interface GroupRepository<T, F, G> {
   fun save(): Kind<T, Group>
   fun findAll() Kind<F, Kind<G Group>>
}

Реализация

class GroupRepositoryJpa(): GroupRepository<ForIO, ForIO, ForPageK> {

   override fun findAll(): IO<PageK<Group>> {
       val groups : Page<Group> = ...
       return IO { groups.k() }
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...