type VAR = identifier
type code = instruction list
type environment = identifier list
type EXPR = environment -> code * environment
fun ADD_OP expr expr' env = DUMMY
fun SUB_OP expr expr' env = DUMMY
fun MUL_OP expr expr' env = DUMMY
fun DIV_OP expr expr' env = DUMMY
fun MOD_OP expr expr' env = DUMMY
fun NUM n env = ([I_Int n],env)
我想在这里写一个延续函数。此代码是较大代码的一部分,用于执行机器指令。此代码的功能是将抽象语法代码转换为机器代码。下面是机器代码的指令集,它从堆栈中取两个操作数执行操作并将结果推送到堆栈
I_Add
I_Mod
I_Sub
I_Div
而
I_Int
将整数值推送到堆栈。当代码在堆栈上找不到所需的操作数时,代码将在尝试执行指令时发出中止信号。假设您正在执行I_Add,那么堆栈上必须有两个操作数,否则它将发出中止信号。
直到知道我只能为I_Int操作编写正确的代码
fun NUM n env = ([I_Int n],env)
此代码将整数n压入堆栈。我知道这里的策略是首先执行" expr"和" expr'"然后将指令添加到列表中 我试着用以下方式编写代码
fun ADD_OP expr expr' env = expr env
(fn ((c,_),env) => expr' env
(fn ((c',_),env) => ((c::c'::[I_Add]),env)))
但这会导致类型不匹配错误
Error: value type in structure doesn't match signature spec
name: ADD_OP
spec: ?.EXPR -> ?.EXPR -> ?.EXPR
actual: ('a -> ('b * 'c -> Machine.Code.instruction list * 'c) -> 'd)
-> 'e -> 'a -> 'd
请有人指出我如何解决此错误的正确方向。我知道我的方法是正确的,但我不理解延续。我尝试这个超过2天但是无法解决这个问题。如果有人知道如何在SML中编写连续文件的任何教程,也会有所帮助。
答案 0 :(得分:2)
我不确定这是你的问题,但这不符合评论,而且我找不到重复(有一些)。
在定义使用它的函数后更改了类型定义时,会出现类似?.EXPR
的神秘“奇怪”类型。
示例:
- datatype None = A;;
datatype None = A
- fun f A = 3;;
val f = fn : None -> int
- f A;;
val it = 3 : int
- datatype None = A;;
datatype None = A
- f A;;
stdIn:11.1-11.4 Error: operator and operand don't agree [tycon mismatch]
operator domain: ?.None
operand: None
in expression:
f A