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 in" 状态的一部分。
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)
我不是很好的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 in" 状态的一部分。
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)