F#中无法使用无限类型(也就是递归类型)吗?

时间:2009-08-04 16:48:01

标签: f# types type-inference

我在Twitter上与Sadek Drobi聊天时,F#似乎不支持无限类型。事实证明,在C#中你可以沿着这些方向做点什么:

delegate RecDelegate<T> RecDelegate<T>(T x);

然而,经过对我们两个部分的一些实验,我们确定F#中的相同内容似乎不可能是隐式和明确的。

type 'a specialF = 'a->specialF<'a>
  

错误FS0191:此类型定义   涉及立即循环引用   通过缩写struct字段   或继承关系。

隐式:

let rec specialF (x: 'a) = specialF
  

类型不匹配。期待'b但是   给'a - &gt; “B。结果类型   在统一''b'时会是无限的   和'' - &gt; 'B'。

当然,这些都是故意简单的样本。

我想知道我是不是错了。也许我错过了某种必要的注释?

3 个答案:

答案 0 :(得分:7)

您也可以执行类似

的操作
type 'a RecType = RecType of ('a -> 'a RecType)

创建一个命名类型,通过它来执行递归。现在这个有效:

let rec specialF = RecType (fun _ -> specialF)

答案 1 :(得分:6)

type d<'T> = delegate of 'T -> d<'T>  //'
let del : d<int> = null
let anotherDel = del.Invoke(1).Invoke(2).Invoke(3)

我认为你需要一个可以直接在CLI中表示的命名类型来打破递归,所以在F#中这意味着你也需要一个实际的委托类型。

答案 2 :(得分:3)

递归记录类型也应该有用。

type A = { A : A }
let rec a : A = { A = a }

我对实际应用感兴趣。甚至是不切实际的一个:)