在我遇到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
我想了解这是什么。简要概述和/或一些参考将不胜感激!
答案 0 :(得分:2)
论文Elaborator Reflection: Extending Idris in Idris定义了伊德里斯的核心语言TT
的Idris表示:
核心语言由两种不同的数据类型表示:
Raw
和TT
。Raw
用于表示要提交的字词 到类型检查器,而TT
表示由类型检查器生成的术语。
图3给出了Raw
和TT
的以下概述:
-- 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,其中描述了准分数机制。