我对Haskell很新,如果这是一个基本问题,或者基于不稳定理解的问题,那就很抱歉
类型级编程对我来说是一个很有意思的想法.我认为我得到了基本的前提,但我觉得还有另一面对我来说是模糊的.我认为这个想法是使用类型将逻辑和计算带入编译时而不是运行时.通过这种方式,您可以将通常的运行时逻辑/状态/数据转换为静态逻辑,例如集合的大小.
所以我得到了例如你可以有类型级自然数,并对这些自然数进行类型级算术,所有这些计算和类型安全性在编译时进行.
但这种算术在运行时意味着什么呢?特别是因为Haskell具有完全类型的擦除.所以举个例子
它纯粹是一个编译时安全/一致性工具吗?或类型级编程是否也为运行时购买任何东西?逻辑和算术是"在编译时支付"还是仅仅"在编译时保证"(如果这有意义的话)?
我正在对一些高度声明性的代码进行原型设计,而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<*>>()
Run Code Online (Sandbox Code Playgroud)
我们想要一个能够有效地执行此操作的功能,除了一般情况
fun B<A<*>>.doTransitiveThing(c: C<B<*>>) : C<A<*>>
{
// implement
}
val ca = ba.doTransitiveThing(cb) // Returns C<A<*>>
Run Code Online (Sandbox Code Playgroud)
目标标准:
C
作为PARAM并返回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: …
Run Code Online (Sandbox Code Playgroud)