Reflection 关于类型参数的思考
我正在尝试创建一个函数Reflection 关于类型参数的思考,reflection,idris,Reflection,Idris,我正在尝试创建一个函数 import Language.Reflection foo : Type -> TT 我用reflect策略进行了尝试: foo = proof { intro t reflect t } 但这反映在变量t本身上: *SOQuestion> foo \t => P Bound (UN "t") (TType (UVar 41)) : Type -> TT Idris中的反射是纯语法的、仅编译时的特性。要预测它将如何工
import Language.Reflection
foo : Type -> TT
我用reflect
策略进行了尝试:
foo = proof
{
intro t
reflect t
}
但这反映在变量t
本身上:
*SOQuestion> foo
\t => P Bound (UN "t") (TType (UVar 41)) : Type -> TT
Idris中的反射是纯语法的、仅编译时的特性。要预测它将如何工作,您需要了解Idris如何将您的程序转换为其核心语言。重要的是,您将无法在运行时获得反射项并像使用Lisp一样重新构建它们。以下是您的程序的编译方式:
type->TT
foo
的校对脚本。我们从没有假设和类型type->TT
的目标开始。也就是说,正在构造一个术语,它看起来像?rhs:Type=>TT。rhs
。?foo:ty=>body
语法显示有一个名为foo
的孔,其最终值将在body
内部可用intro t
创建了一个参数为t:Type
的函数-这意味着我们现在有了一个类似?foo\u body:TT的术语\t:Type=>foo\u body
reflect t t
步骤将右侧的术语转换为TT
来填充当前孔。该术语实际上只是对函数参数的引用,因此得到变量t
<代码>反射,与所有其他校对脚本步骤一样,只能访问编译时直接可用的信息。因此,用术语t
的反射填充foo_body
的结果是P绑定(UN“t”)(t类型(UVar(-1))
applytatic
策略。它的参数应该是一个函数,它接受反映的上下文和目标,并返回一个新的反映的战术脚本。可以看到一个例子
所以我想总结一下,Idris不能做你想做的事情,而且它可能永远也做不到,但你可以用另一种方式取得进展