【问题标题】:Why does the below continuation function in SML not working?为什么 SML 中的以下延续功能不起作用?
【发布时间】:2023-03-06 11:25:01
【问题描述】:
   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 中编写 contiuations 的教程也会有所帮助。

【问题讨论】:

  • 你能把instruction的定义也包括进来吗?

标签: sml smlnj continuations


【解决方案1】:

我不确定这是您的问题,但这不适合评论,而且我找不到重复的内容(有几个)。

当您在定义使用它的函数之后更改了类型定义时,就会出现像 ?.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

【讨论】:

    猜你喜欢
    • 2015-10-09
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多