Изменение от Dynami c Scoping до Stati c Scoping / Lexical Scoping - PullRequest
2 голосов
/ 23 апреля 2020

Как мне изменить big_step_Decls (Proc p s), чтобы следовать правилу stati c и соответствовать типу pro c?

Это правило для объявления stati c pro c, которое я хочу реализовать:

<decls, env [p -> (s, env)] --> <sto', env'>
------------------------------------------------
<proc p is s : decls, env, sto > --> <sto', env'>

Это фрагмент кода Haskell для семантики большого шага для деклараций переменных и процедур.

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)

Это ошибка, которую я получаю (PS : Я новичок в Haskell и все еще пытаюсь понять основы.)

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.

1 Ответ

3 голосов
/ 23 апреля 2020

В этом выражении env'' = env {proc = (insert p s) (proc env)} p - ключ карты, а s - значение. Значения на карте proc имеют тип (Stm, Env), но в настоящее время вы пытаетесь вставить s только для типа Stm.

Итак, вам нужно передать дополнительную среду для компиляции кода. Что-то вроде:

env'' = env {proc = insert p (s, env) (proc env)}

Я не знаю, имеет ли это смысл в вашей программе, хотя: -).

...