[英]Haskell StateT and ExceptT chain
我不是很好的haskell程序员。 我的任务是在大学里编写编译器,我选择了Haskell,因为它是实现此目的的好工具。 我正在使用monads StateT和ExcepT,所以我有以下类型:
type Runner r s = StateT s (ExceptT LatteError IO) r
type RT r s = IO (Either LatteError (r, s))
我用它创建一个程序树并生成asm代码,它可以按我的意愿工作。 作为走树的主要功能,我使用
rProgram :: Program -> Runner [String] CompileState
并解压结果,我使用功能
runR program = runExceptT (runStateT (rProgram program) initialCompileState)
我不想做的是拥有一些验证器,例如类型检查,身份存在检查,而且我知道要编写它们。 告诉我有
tcProgram :: Program -> Runner () TypeCheckState
ieProgram :: Program -> Runner () IdentExistanceState
我想以一种优雅的方式运行它们,并且throwError指示失败。 如何将许多类似的功能放在一起?
lens
具有zoom
组合器,该组合器使用镜头在状态的一部分上“放大”。
zoom :: Lens' s t -> State t a -> State s a
(通常在lens
, zoom
的实际类型比这要复杂得多,但这是思考它的一种简单方法。)
所以我们有
zoom _1 . tcProgram :: Program -> Runner () (TypeCheckState, t)
zoom _2 . ieProgram :: Program -> Runner () (s, IdentExistenceState)
所以
liftA2 (>>) (zoom _1 . tcProgram) (zoom _2 . ieProgram) :: Program -> Runner () (TypeCheckState, IdentExistenceState)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.