语法-1.3:通用抽象语法和嵌入式语言实用程序

安全哈斯克尔

语言。句法。语法

目录

说明

类型化语法树的泛型表示

有关详细信息,请参阅:嵌入式语言的通用抽象语法模型(ICFP 2012,http://www.cse.chalmers.se/~emax/documents/axelsson2012generic.pdf).

简介

语法树

数据 AST公司dom信号哪里来源

通用抽象语法树,由符号域参数化

(AST公司dom(一个:->b) )表示部分应用(或未应用)符号,缺少至少一个参数,而(AST公司dom公司(完全a) )表示完全应用的符号,即完整的语法树。

建造师

Sym公司::dom签名->AST公司dom信号 
:$::AST公司dom(一个:->信号)->AST公司多姆(完全a) ->AST公司dom信号 

实例

(项目子(AST公司sup),:<:sub-sup)=>sub:<:(AST公司支持) 
项目sub-sup=>项目子(AST公司支持) 
(项目子(AST公司sup),(AST公司上)a,注入Csub-sup a)=>注入C子(AST公司上)a 
Functor(仿真器)dom=>Functor(仿真器)(AST公司dom) 
平等dom=>平等(AST公司dom) 
(伦德尔(AST公司dom),ToTree(ToTree)dom)=>ToTree(ToTree)(AST公司dom) 
伦德尔dom=>伦德尔(AST公司dom) 
评估dom=>评估(AST公司dom) 
受约束的dom=>受约束的(AST公司dom) 
应用Sym(完全a)(ASTF公司dom a)dom(域名) 
平等dom=>方程式(AST公司域名a) 
伦德尔dom=>显示(AST公司域名a) 
句法(ASTF公司域名a) 
(句法a、 ~(*->*)(a) dom,~*ia(内部a) ,语法Nb ib)=>语法N(a->b)(AST公司多姆(完全ia)->ib) 
应用Sym信号f dom=>应用Sym(:->一个信号)(ASTF公司dom a->f)dom 

类型 ASTF公司dom公司=AST公司dom公司(完全a)来源

完全应用的抽象语法树

新类型 完全来源

完全应用符号的签名

建造师

完全 

领域

结果::a
 

实例

Functor(仿真器) 完全 
可键入1 完全 
方程式a=>方程式(完全a) 
显示a=>显示(完全a) 
应用Sym(完全a)(ASTF公司dom a)dom(域名) 
句法(ASTF公司域名a) 
(句法a、 ~(*->*)(a) dom,~*ia(内部a) ,语法Nb ib)=>语法N(a->b)(AST公司dom公司(完全ia)->ib) 
应用Sym信号f dom=>应用名称(:->一个信号)(ASTF公司dom a->f)dom 

新类型:->信号发生器来源

部分应用(或未应用)符号的签名

建造师

部分(a->信号) 

实例

可键入2 :-> 
Functor(仿真器)(:->a) 
应用Sym信号f dom=>应用名称(:->一个信号)(ASTF公司dom a->f)dom 

大小::AST公司dom信号->国际来源

计算表达式中的符号数

应用Symsig f dom | sig dom->f,f->sig dom哪里来源

所需类型级递归的类应用程序Sym

实例

应用Sym(完全a)(ASTF公司dom a)dom(域名) 
应用Sym信号f dom=>应用Sym(:->一个信号)(ASTF公司dom a->f)dom 

类型族 拒绝结果信号发生器来源

具有给定签名的符号的结果类型

符号域

数据(域1:+:域2)a哪里来源

两个符号域的直和

建造师

注入::dom1 a->(dom1:+:域2)a 
注射::dom2 a->(dom1:+:域2)a 

实例

(项目表达式1(:+:expr2 expr3),:<:expr1 expr3)=>expr1:<:(:+:expr2 expr3) 
项目表达式1(:+:expr1 expr2)=>expr1:<:(:+:expr1 expr2) 
项目expr1 expr3=>项目表达式1(:+:expr2 expr3) 
项目表达式1(:+:expr1 expr2) 
(项目表达式1(:+:expr2 expr3),(:+:expr2 expr3)a,注入Cexpr1 expr3 a)=>注入C表达式1(:+:expr2 expr3)a 
(项目表达式1(:+:expr1 expr2),(:+:expr1 expr2)a)=>注入C表达式1(:+:expr1和expr2)a 
(Functor(仿真器)域1,Functor(仿真器)域2)=>Functor(仿真器)(:+:域1域2) 
(平等表达式1,平等expr2)=>平等(:+:expr1 expr2) 
(伦德尔(:+:expr1 expr2),ToTree(ToTree)表达式1,ToTree(ToTree)expr2)=>ToTree(ToTree)(:+:expr1 expr2) 
(伦德尔表达式1,伦德尔expr2)=>伦德尔(:+:expr1 expr2) 
(评估表达式1,评估expr2)=>评估(:+:expr1 expr2) 
受约束的(:+:sub1 sub2) 
(评估绑定sub1、,评估绑定sub2)=>评估绑定(:+:sub1 sub2) 
(优化sub1、,优化sub2)=>优化(:+:sub1 sub2) 
TupleSat卫星dom2 p=>TupleSat卫星(:+:域1域2)p 
TupleSat卫星(:+:(:|| 选择p) 域2)p 
TupleSat卫星(:+:(以下为:|| 薄纱p) 域2)p 
(AlphaEq(阿尔法公式)subA1 subB1 dom环境,AlphaEq(阿尔法公式)subA2 subB2 dom env)=>AlphaEq(阿尔法公式)(:+:subA1 subA2)(:+:subB1 subB2)dom环境 
(平等表达式1,平等expr2)=>方程式(:+:表达式1表达式2 a) 
(伦德尔表达式1,伦德尔expr2)=>显示(:+:expr1 expr2 a) 

项目sub-sup公司哪里来源

符号投影

方法

prj公司::supa->也许 吧(子项a)来源

部分投影自啜饮潜艇

实例

项目expr表示 
项目sub-sup=>项目子(AST公司支持) 
项目expr1 expr3=>项目表达式1(:+:expr2 expr3) 
项目表达式1(:+:表达式1表达式2) 
项目sub-sup=>项目子(:||sup-pred) 
项目子sup=>项目子(:|sup-pred) 
项目sub-sup=>项目子(装饰信息支持) 
项目sub-sup=>项目子(分项工程1c供应) 
项目sub-sup=>项目子(次级施工2c sup pa pb) 

项目sub-sup=>sub:<:啜饮哪里来源

符号包含

方法

注射::sub a->sup a来源

注入来自潜艇啜饮

实例

项目expr-expr=>表达式:<:快递 
(项目子(AST公司sup),:<:sub-sup)=>sub:<:(AST公司支持) 
(项目表达式1(:+:expr2-expr3),:<:expr1 expr3)=>expr1:<:(:+:表达式2表达式3) 
项目表达式1(:+:expr1 expr2)=>expr1:<:(:+:expr1 expr2) 

应用程序Sym:: (应用名称sig f dom,sym公司:<: AST公司dom)=>sym-sig->f来源

通用符号应用

应用程序Sym具有任何类型的表单:

appSym::(表达式:<:AST dom)=>表达式(a:->b:->…:->完整x)->(ASTF dom a->ASTF dom b->…->ASTF dom x)

类型推断

symType(符号类型)::P(P)sym->sym sig->sym sig来源

将符号约束为特定类型

prjP公司::项目sub-sup=>P(P)sub->sup-sig->也许 吧(亚sig)来源

投影到特定符号类型