首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell StateT和ExceptT链

Haskell StateT和ExceptT链
EN

Stack Overflow用户
提问于 2017-02-08 12:49:57
回答 1查看 370关注 0票数 1

我不是很好的haskell程序员。我的任务是在我的大学写一个编译器,我选择了haskell,因为它是一个很好的工具。我使用的是monads和ExcepT,所以我有类型:

代码语言:javascript
复制
type Runner r s = StateT s (ExceptT LatteError IO) r
type RT r s = IO (Either LatteError (r, s))

我使用它创建、遍历程序树并生成asm代码,它可以按照我的意愿工作。作为行走树的主要功能,我使用

代码语言:javascript
复制
rProgram :: Program -> Runner [String] CompileState

为了解压结果,我使用函数

代码语言:javascript
复制
runR program = runExceptT (runStateT (rProgram program) initialCompileState)

我不想做的是有一些验证器,比如类型检查,ident存在检查,我知道要写它们。让我告诉你我有

代码语言:javascript
复制
tcProgram :: Program -> Runner () TypeCheckState
ieProgram :: Program -> Runner () IdentExistanceState

我想以优雅的方式运行它们,throwError指出了一个失败。如何将像它们这样的许多功能组合在一起?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-08 12:58:21

lens有一个zoom组合器,它使用镜头“放大”状态的一部分。

代码语言:javascript
复制
zoom :: Lens' s t -> State t a -> State s a

(与lens中常见的情况一样,实际类型的zoom要复杂得多,但这是一种简单的思考方法。)

所以我们有

代码语言:javascript
复制
zoom _1 . tcProgram :: Program -> Runner () (TypeCheckState, t)
zoom _2 . ieProgram :: Program -> Runner () (s, IdentExistenceState)

所以

代码语言:javascript
复制
liftA2 (>>) (zoom _1 . tcProgram) (zoom _2 . ieProgram) :: Program -> Runner () (TypeCheckState, IdentExistenceState)
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42113610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档