gpt4 book ai didi

generics - kotlin 中的高阶(或递归?)泛型类型参数

转载 作者:IT老高 更新时间:2023-10-28 13:40:57 24 4
gpt4 key购买 nike

我正在对一些高度声明性的代码进行原型(prototype)设计,而 Kotlin 附带的类型推断和安全性有很大帮助。目标之一是使主要类型的扩展(子类)非常容易实现。为了保持丰富的类型推断和表达能力,我发现在定义针对子类投影的通用扩展函数方面取得了一些成功。子类方法的所有类型信息,没有额外的子类实现,太好了。

所以我正在尝试编写一个丰富的泛型函数来维护尽可能多的类型信息。问题在于这个函数对潜在的递归泛型类型进行操作,我想改组泛型类型参数。

如果没有例子,这将无法描述。所以考虑:

open class G<in T>
class A<in T> : G<T>()
class B<in T> : G<T>()
class C<in T> : G<T>()
val ba = B<A<*>>()
val cb = C<B<*>>()

我们想要一个能有效地做到这一点的函数,除了一般情况

fun B<A<*>>.doTransitiveThing(c: C<B<*>>) : C<A<*>>
{
// implement
}

val ca = ba.doTransitiveThing(cb) // Returns C<A<*>>

目标标准:

  • 需要C作为参数并返回 C , 不同的泛型类型参数除外
  • 我想将此行为概括为 G 的所有子类的扩展函数
    • 它需要是一个扩展函数,以便使用泛型类型我们可以拥有子类的类型,并确保参数具有接收者类型的泛型类型参数。
    • 或者换句话说,我们想要 G 的子类的扩展函数所以参数必须是C<B<*>>而不是 C<G<*>>B<A<*>> 上调用时

这描述了问题的要点。我不确定该语言是否能够支持我想要的。我不确定类型删除是否是导致这不可能的一个因素,但到目前为止我找不到它(如果是这样的话,也许我可以使用帮助)。


以下是关闭的

fun <
TargetGenericType,
Arg1Type: G<*>,
ReceiverType: G<TargetGenericType>,
Arg2Type: G<Arg1Type>,
ResultType: G<TargetGenericType>
>
ReceiverType.doTransitiveThingGeneric(x: Arg2Type): ResultType
{
//implement
}
val ca2 = ba.doTransitiveThingGeneric(cb)

但是有一些问题

  • 返回 G<A<*>>而不是 C<A<*>> .如果能返回C就好了并且不会丢失类型信息(否则我并没有真正使用此功能)
  • 技术上无法保证 ReceiverTypeArg1Type

提前考虑,如果以下内容是有效的 Kotlin,我认为它会解决我的问题

fun <
TargetGenericType,
ReceiverBaseType<T>: G<T>,
typealias ReceiverType = ReceiverBaseType<TargetGenericType>,
ParamBaseType<U>: G<U>,
typealias ParamType = ParamBaseType<ReceiverBaseType<*>>,
ResultType: ParamBaseType<TargetGenericType>
>
ReceiverType.doTransitiveThingHigherOrderGeneric(x: ParamType): ResultType
{
//implement
}

有什么原因不能完成吗?例如添加为语言的功能?我对反对的后勤原因表示同情,但我很好奇这在原则上是否也是可能的。

最后的笔记:

  • 它让我想起了除泛型类型参数本身之外的类型别名。事实上,我已经在示例中包含了该关键字,以防它有助于消化。但这不是唯一的部分,请注意 <T><U>在语法中。
  • 它几乎也让我想起了 Monads,除了类定义本身,如果这在某种手波直观的方式中有意义的话。
  • 我还不知道如何实现主体,但我还没有走那么远,因为我仍在尝试查看签名是否可能:p

最佳答案

我最终要找的是higher kinds .我试图将其全部强制为一个过度嵌套的类型构造函数。我想要完成的操作无法以这种方式实现,必须使用多个类型参数来完成。函数库Arrow's description of higher kinds帮助我意识到这一点。

In a Higher Kind with the shape Kind<F, A>, if A is the type of the content then F has to be the type of the container.

A malformed Higher Kind would use the whole type constructor to define the container, duplicating the type of the content Kind<Option<A>, A>. This incorrect representation has large a number of issues when working with partially applied types and nested types.

关于generics - kotlin 中的高阶(或递归?)泛型类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44408683/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com