我试图从基于变换器的monad堆栈重写一个简单的解释器到基于更自由的效果,但是我正在努力将我的意图传达给GHC的类型系统.
我目前只使用State和Fresh效果.我正在使用两种状态,我的效果运动员看起来像这样:
runErlish g ls = run . runGlobal g . runGensym 0 . runLexicals ls
where runGlobal = flip runState
runGensym = flip runFresh'
runLexicals = flip runState
Run Code Online (Sandbox Code Playgroud)
最重要的是,我已经使用以下类型定义了一个函数FindMacro:
findMacro :: Members [State (Global v w), State [Scope v w]] r
=> Arr r Text (Maybe (Macro (Term v w) v w))
Run Code Online (Sandbox Code Playgroud)
到目前为止所有这一切都完美无缺.当我尝试编写时出现问题macroexpand2(好吧,macroexpand1,但我正在简化它,所以问题更容易理解):
macroexpand2 s =
do m <- findMacro s
return $ case m of
Just j -> True
Nothing -> False …Run Code Online (Sandbox Code Playgroud)