gra*_*ero 5 haskell clojure pattern-matching
我正在开展一个项目,以在 Clojure 中重新创建 Haskell 的一些功能。我已经成功地实现了 Hindley-Milner 类型推断,现在我正在尝试通过宏引入模式匹配语法。我的目标是让宏首先发出有效的 Clojure 代码,然后对该代码进行类型检查,但我发现这很难做到。由于我是 Haskell 和静态类型的新手,因此我不确定是否有我看不到的方法,或者是否不可能。
我正在尝试遵循Luc Maranget 的算法,至少目前是天真的版本。我的理解是,您在编译时采用值向量(或“出现次数”)并将其视为堆栈。通过第一列的构造函数对模式行进行分组后,您将找到与向量中第一个值的构造函数对应的模式组。如果向量是(v1 ... vn),v1是c(a1 ... ak),其中c是构造函数,a1 ... ak是构造函数的参数,则删除构造函数c并将参数与向量连接起来,创建新的向量(a1 ... ak v2 ... vn),然后递归地运行算法。
我的问题是,您如何以可类型检查的方式表示这样的向量或堆栈?同样,我的目标是让 Clojure 宏发出既准备好处理运行时值又准备在编译时进行类型检查的代码。我可以引入一个中间步骤,其中第一个宏发出可进行类型检查但本身也是一个宏的代码,然后让第二个宏发出实际运行的代码。但即使这样有效,也不太令人满意,因为它表明我无法在 Haskell 本身中完成这样的任务。我错过了什么吗?
- 编辑 -
我现在看到我的困惑源于我在静态类型方面的短暂经验中没有遇到过必须处理异构集合的情况。我的问题本来可以更清楚地表述出来,但由于我正在规划问题空间,因此我并不总是确定障碍是什么,或者它与我正在处理的其他所有事情有什么关系。感谢下面的评论,我相信为了克服这个特殊的挑战,我只需要更好地理解在 Haskell 中处理异构集合的可用选项。这篇文章似乎是一个很好的起点。