我目前正在尝试使用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...
之类的东西,直到它到达终点,但我无法在不遇到类型爆炸问题的情况下看到这样做的方法。
如果有人能指出一个有助于创建任意长度的任意函数链的方向,我会很感激。
答案 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