使用类型检查

时间:2017-06-24 02:23:54

标签: haskell clojure pattern-matching

我正在开发一个项目来重新创建Clojure中Haskell的一些功能。我已经成功实现了Hindley-Milner类型的推理,现在我试图通过宏引入模式匹配语法。我的目标是让宏首先发出有效的Clojure代码,然后键入 - 检查该代码,但我发现这很难做到。由于我是Haskell的新手和一般的静态类型,我不确定是否有办法让我看不到,或者是否只是不可能。

我正试图关注Luc Maranget's algorithm,至少现在是天真的版本。我的理解是你采用一个值向量(或在编译时“出现”)并将其视为一个堆栈。在通过第一列的构造函数对模式行进行分组后,您会找到与向量中第一个值的构造函数对应的模式组。如果向量为(v1 ... vn)v1c(a1 ... ak),其中c为构造函数,a1 ... ak为构造函数的参数,则删除构造函数c并将参数与向量连接起来,创建新的向量(a1 ... ak v2 ... vn),并递归地运行算法。

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

- 编辑 -

我现在看到我的困惑源于我在静态类型的短暂体验中遇到的情况,我不得不处理异构集合。我的问题本来可以更清楚地表达出来,但是由于我正在逐步解决问题空间,我并不总是确切地知道障碍是什么,或者它与我正在处理的其他事情有什么关系。感谢下面的评论,我相信为了克服这个特殊的挑战,我只需要更好地理解可用于处理Haskell中的异构集合的选项。 This article似乎是一个很好的起点。

0 个答案:

没有答案