type InterpreterMonad = StateT (Env, Env) (ErrorT String IO)()
interpreter :: Stmts -> InterpreterMonad
interpreter (Statements s EmptyStmts) = interpreteStmt s
interpreter (Statements s stmts) = interpreteStmt s >>= \m -> (interpreter stmts)
-- definicja funkcji
interpreteStmt :: Stmt -> InterpreterMonad
interpreteStmt (DefFun (VarName name) args typ begin statements end) = get >>=
\(envOut, (sInnerEnvFun, sInnerEnvEVal)) -> case (Map.lookup (VarName name) sInnerEnvFun) of
Nothing -> put ((envOut, ((Map.insert (VarName name) (DefFun (VarName name) args typ begin statements end) sInnerEnvFun), sInnerEnvEVal))) >>= \_ -> return()
(Just x) -> throwError "ee"
こんにちは、私はなぜget
とput
関数を呼び出すことができます理解できません?ハスケルは "どこ"が国家であるかをどのように知っていますか?私は命令型プログラミングに有利な問題を抱えています。結局のところ、そのような関数をオブジェクトとして(メソッドとして)呼び出すか、引数で状態を渡す必要があります。モナド州と関数を取得
私はあなたを知っていると思います(新しいアカウントを作成する必要はありません)) - ハスケルはあなたがいる文脈からそれを知っています - このように考える: 'put'はプレースホルダーのようです - あるアクションの - と '' = 'は、それが他の計算と接続します - それはそれが知っている方法です - 特定のタイプの' '= ''(または特定のタイプの' do'ブロック)...詳細は少し複雑ですが、おそらくそれを理解することは重要ではありません – Carsten
これは、 'StateT'をあなたが今*何かを実行するのではなく、' runStateT'で実行するプラン* 。 'get'と' put'はその* plan *の中のただ一つのステップであり、* now *の状態と対話する関数ではありません。 –