繁体   English   中英

Haskell StateT和ExceptT链

[英]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

(通常在lenszoom的实际类型比这要复杂得多,但这是思考它的一种简单方法。)

所以我们有

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM