样式模式匹配与类型检查

我正在开发一个项目,在Clojure中重新创建Haskell的一些功能。 我成功实现了Hindley-Milner类型推断,现在我试图通过宏引入模式匹配语法。 我的目标是先让宏发出有效的Clojure代码,然后键入检查代码,但我发现这很难做到。 由于我对Haskell和静态打字都是全新的,所以我不确定是否有办法做到这一点,我没有看到,或者它是不可能的。

我试图按照Luc Maranget的算法,至少现在是天真的版本。 我的理解是,你将一个向量值(或编译时的“出现次数”)作为一个堆栈。 在按照第一列的构造函数对模式行进行分组后,可以找到与向量中第一个值的构造函数相对应的模式组。 如果向量是(v1 ... vn) ,并且v1c(a1 ... ak) ,其中c是构造函数, a1 ... ak是构造函数的参数,则删除构造函数c并连接向量的参数,创建新的向量(a1 ... ak v2 ... vn) ,并递归运行该算法。

我的问题是,你如何以类型可检查的方式来表示这样一个向量或堆栈? 同样,我的目标是让Clojure宏发出既能处理运行时值又能在编译时进行类型检查的代码。 我可以介绍一个中间步骤,其中第一个宏发出类型可检查的代码,但它本身也是一个宏,然后让第二个宏发出实际运行的代码。 但即使这样做,它也不那么令人满意,因为它表明我无法在Haskell本身完成这样的任务。 我错过了什么吗?

- 编辑 -

我现在看到,我的困惑源自我在静态打字方面的短暂经历中遇到的情况,在这种情况下,我不得不处理异构集合。 我的问题本可以更清楚地表达出来,但是由于我一直在寻找问题空间,所以我并不总是确定一个障碍是什么,或者它与我正在处理的其他事情有什么关系。 感谢下面的评论,我相信要克服这个特殊挑战,我只需要更好地理解处理Haskell中异构集合的可用选项。 这篇文章似乎是一个很好的起点。

链接地址: http://www.djcxy.com/p/80893.html

上一篇: style pattern matching with type checking

下一篇: What algorithms does the Rust compiler use to infer lifetime variables?