Functional programming 如何键入编译器?

Functional programming 如何键入编译器?,functional-programming,type-theory,Functional Programming,Type Theory,以两台抽象机器和两条指令为例,其语义用以下虚构(功能)语言编码: class incr; // preserves @code, increments @pc, increments @x fn execA(state: {pc: i32, code: {(pc): incr}, x: i32}): {code: `state.code`, pc: `state.pc+1`, x: `state.x+1`} class incrBy2; // preserves @code, increme

以两台抽象机器和两条指令为例,其语义用以下虚构(功能)语言编码:

class incr;
// preserves @code, increments @pc, increments @x
fn execA(state: {pc: i32, code: {(pc): incr}, x: i32}): {code: `state.code`, pc: `state.pc+1`, x: `state.x+1`} 

class incrBy2;
// preserves @code, increments @pc, adds 2 to @x
fn execB(state: {pc: i32, code: {(pc): incrBy2}, x: i32}): {code: `state.code`, pc: `state.pc+1`, x: `state.x+2`}
其中
{(i):i32}
[string,i32,f64]
iff
i==1
的子类型,因此
状态.code
是一个指令元组。此外,我们还有一些表达式类型,它们是仅由给定表达式占据的单例类型(想想scala中的路径依赖类型)

语句:给定代码
[incrBy2]
可以将其重写为
[incr,incr]


问题:您将如何(用我们虚构的语言)将上述陈述形式化

通过编写
fn execB(state):execA(execA(state))
?完全不清楚您的问题与类型有什么关系。如果不清楚,我很抱歉,这是因为我甚至难以陈述我试图回答的问题:(我可能首先寻找as-if规则的形式化,然后是一个函数签名获取代码(包含incrBy2)用两个incr替换每个incr,同时保留该规则,作为进一步的步骤,我们可以使execA不是递增“x”,而是递增其他成员,如“eax”,因此,我们还必须在表示状态的类型之间建立一种映射,似乎规则的形式化可能会成为你的虚构语言的一个障碍。