功能编程:在AST中嵌入函数?

时间:2017-12-05 13:09:01

标签: function f# functional-programming abstract-syntax-tree

我目前正在尝试使用F#将链接功能建模在一起作为AST的一部分(尽管目前它更像是一个链)。每个链接都是一个函数,它也可以附加一个链。但是,要指定链接所附链的类型签名,还必须添加更多类型参数。但是你这样做了,然后又添加了一个参数,等等。无限制地。下面是一个例子。

type Chain<'a, 'b, 'c> =
| Link of ('a -> 'b) * Chain<'c>  // This doesn't work - you need more type params supplied
| End  of 'a

我希望能够将链表示为Link ((fun x -> x + 5), Link...之类的东西,直到它到达终点,但我无法在不遇到类型爆炸问题的情况下看到这样做的方法。

如果有人能指出一个有助于创建任意长度的任意函数链的方向,我会很感激。

1 个答案:

答案 0 :(得分:4)

虽然这个问题有点不清楚,但我认为你所要求的更像是(假设语法):

type Chain<'a> =
| Link of ('b -> 'a) * Chain<'b>
| End of 'a

我们在'b的情况下在中引入一个新类型参数Link - 它可以是任何类型,只要函数的域与类型参数匹配嵌套的Chain<_>。这与“存在类型”的概念有关(基本上是泛型通用型量化的双重概念)。

坏消息:在F#中没有简单的语法来实现这一点。 好的(?)新闻:如果你真的想要编码,那就有一种非常难看的方式。

结果是,如果你想表达你的链接类型之类的想法,可以通过机械方式引入一些辅助类型来实现(类型∃'t.F<'t>可以编码为{{1可以用F#类型系统表示。)

以下是您在此编码下的示例:

∀'x.(∀'t.F<'t> -> 'x) -> 'x