我在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'。
当然,这些都是故意简单的样本。
我想知道我是不是错了。也许我错过了某种必要的注释?
答案 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 }
我对实际应用感兴趣。甚至是不切实际的一个:)