首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从动态作用域更改为静态作用域/词法作用域

从动态作用域更改为静态作用域/词法作用域
EN

Stack Overflow用户
提问于 2020-04-23 08:14:04
回答 1查看 79关注 0票数 2

如何更改big_step_Decls (Proc p s)以遵循静态作用域规则并匹配proc类型?

这是我想实现的静态proc声明的规则:

代码语言:javascript
复制
<decls, env [p -> (s, env)] --> <sto', env'>
------------------------------------------------
<proc p is s : decls, env, sto > --> <sto', env'>

这是Haskell代码的一个片段,用于变量和过程声明的大步语义。

代码语言:javascript
复制
data Env = Env {var :: Map String Loc, proc :: Map String (Stm, Env)} deriving Show

env0 = Env { var = empty, proc = empty}


big_step_Decls :: ([Decl], Env, Sto) -> (Env, Sto)

big_step_Decls ([], env, sto) = (env, sto)

big_step_Decls ((VarD x a): more_decls, env, sto) = (env', sto')
   where v = big_step_a env sto a'
         (l, sto'') = alloc sto
         env'' = env {var = insert x l (var env)}
         (env', sto') = big_step_Decls (more_decls, env'', insert l v sto'')

big_step_Decls ((Proc p s): more_decls, env, sto) = (env',sto')
   where env''  = env {proc = insert p s (proc env)}
         (env', sto') = big_step_Decls (more_decls, env'', sto)

这就是我得到的错误(附言:我是Haskell的新手,还在努力弄清楚基础知识。)

代码语言:javascript
复制
BIPs.hs:161:31: error:
    * Couldn't match type `Stm' with `(Stm, Env)'
      Expected type: Map String (Stm, Env)
        Actual type: Map String Stm
    * In the `proc' field of a record
      In the expression: env {proc = (insert p s) (proc env)}
      In an equation for env'':
          env'' = env {proc = (insert p s) (proc env)}
    |
161 |    where env''  = env {proc = (insert p s) (proc env)}
    |                               ^^^^^^^^^^^^^^^^^^^^^^^

BIPs.hs:161:45: error:
    * Couldn't match type `(Stm, Env)' with `Stm'
      Expected type: Map String Stm
        Actual type: Map String (Stm, Env)
    * In the third argument of `insert', namely `(proc env)'
      In the `proc' field of a record
      In the expression: env {proc = (insert p s) (proc env)}
    |
161 |    where env''  = env {proc = (insert p s) (proc env)}
    |                                             ^^^^^^^^
Failed, no modules loaded.
EN

回答 1

Stack Overflow用户

发布于 2020-04-23 16:13:14

在此表达式中,env'' = env {proc = (insert p s) (proc env)} p是映射键,s是值。proc映射中的值具有类型(Stm, Env),但您当前仅尝试插入类型为Stms

所以你需要传递一个额外的环境来编译你的代码。类似于:

代码语言:javascript
复制
env'' = env {proc = insert p (s, env) (proc env)}

我不知道这在你的程序中是否有意义:-)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61377224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档