Как мне изменить 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.