伊德里斯准定量概述

时间:2016-08-27 00:59:03

标签: reflection idris

在我遇到some tests in the test suite之前,我没有意识到伊德里斯有一个准引号。

以下是REPL中的一个简短示例:

Idris> :module Language.Reflection
Idris> `(S Z)
App (P (DCon 1 1)
       (NS (UN "S") ["Nat", "Prelude"])
       (Bind (MN 0 "_t")
             (Pi (P (TCon 0 0) (NS (UN "Nat") ["Nat", "Prelude"]) Erased)
                 (TType (UVar "./Prelude/Nat.idr" 22)))
             (P (TCon 0 0) (NS (UN "Nat") ["Nat", "Prelude"]) Erased)))
    (P (DCon 0 0)
       (NS (UN "Z") ["Nat", "Prelude"])
       (P (TCon 0 0) (NS (UN "Nat") ["Nat", "Prelude"]) Erased)) : TT

我想了解这是什么。简要概述和/或一些参考将不胜感激!

1 个答案:

答案 0 :(得分:2)

论文Elaborator Reflection: Extending Idris in Idris定义了伊德里斯的核心语言TT的Idris表示:

  

核心语言由两种不同的数据类型表示:   RawTTRaw用于表示要提交的字词   到类型检查器,而TT表示由类型检查器生成的术语。

图3给出了RawTT的以下概述:

-- Variable names
data TTName = ...

-- Constants
data Const = I Int | Str String | ...

-- Binders
data Binder : (tmTy : Type) -> Type where
    Lam : (ty : a) -> Binder a
    Pi : (ty, kind : a) -> Binder a
    Let : (ty, val : a) -> Binder a
    PVar : (ty : a) -> Binder a
    Hole : (ty : a) -> Binder a
    Guess : (ty, val : a) -> Binder a

-- Terms which have not yet been typechecked
data Raw = Var TTName
    | RBind TTName (Binder Raw) Raw
    | RApp Raw Raw
    | RType
    | RConstant Const

-- Well typed, de Bruijn indexed terms
data TT = P NameType TTName TT
    | V Int
    | Bind TTName (Binder TT) TT
    | App TT TT
    | TConst Const
    | TType TTUExp

它还引用了论文Type-Directed Elaboration of Quasiquotations,其中描述了准分数机制。