【发布时间】:2013-04-24 23:53:17
【问题描述】:
假设我有一个用某种语言表示 AST 的简单数据类型:
data Term = Var String
| Num Integer
| Expr [Term]
(实际上它显然会有比这更多的构造函数。)
我可以使用它来编写一个与 AST 结构匹配的简单评估函数:
eval :: Term -> Result
eval (Var name) = lookup name
eval (Num n) = return n
eval (Expr exprs) = ...
我能否在不改变模式匹配工作方式的情况下使用行号等信息来注释 AST?
(如果我不介意更改模式,当然可以使用记录语法或视图模式。)
【问题讨论】:
-
像
data AtLine a = AtLine Int a这样的容器ADT怎么样? -
@NikitaVolkov:这正是我会用 ViewPatterns 之类的东西做的事情。我只是想知道是否有一种很好的方法可以完全避免更改模式匹配。
-
如果你匹配的是
Term类型,为什么会影响模式匹配? -
@NikitaVolkov:因为我想在使用术语时保留元数据。例如。
eval可能会引发错误,所以我必须知道它来自哪一行代码。 -
你可以在
evalAtLine :: AtLine Term -> Result这样的外部函数中截获这个错误,并用行信息重新抛出它。
标签: haskell