小编Wor*_*der的帖子

类型级编程在运行时意味着什么?

我对Haskell很新,如果这是一个基本问题,或者基于不稳定理解的问题,那就很抱歉

类型级编程对我来说是一个很有意思的想法.我认为我得到了基本的前提,但我觉得还有另一面对我来说是模糊的.我认为这个想法是使用类型将逻辑和计算带入编译时而不是运行时.通过这种方式,您可以将通常的运行时逻辑/状态/数据转换为静态逻辑,例如集合的大小.

所以我得到了例如你可以有类型级自然数,并对这些自然数进行类型级算术,所有这些计算和类型安全性在编译时进行.

但这种算术在运行时意味着什么呢?特别是因为Haskell具有完全类型的擦除.所以举个例子

  • 如果我连接两个类型级别列表,那么类型级别安全性是否意味着在运行时该连接的行为或性能?或者类型级编程方面只在编译时有意义,当程序员正在努力解决代码并将事物放在一起时?
  • 或者,如果我有两个类型级别编号,然后将它们相乘,那么这在运行时意味着什么?如果这些大数字操作在编译时很慢,那么它们是否在运行时瞬间完成?
  • 或者,如果我们实现了类型级别的RSA然后使用它,那在运行时甚至意味着什么呢?

它纯粹是一个编译时安全/一致性工具吗?或类型级编程是否也为运行时购买任何东西?逻辑和算术是"在编译时支付"还是仅仅"在编译时保证"(如果这有意义的话)?

haskell

10
推荐指数
1
解决办法
322
查看次数

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

我正在对一些高度声明性的代码进行原型设计,而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)

generics nested-generics kotlin

8
推荐指数
1
解决办法
478
查看次数

标签 统计

generics ×1

haskell ×1

kotlin ×1

nested-generics ×1