为什么SML中的以下延续函数不起作用?

时间:2016-02-28 04:26:12

标签: sml smlnj continuations

   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中编写连续文件的任何教程,也会有所帮助。

1 个答案:

答案 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