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

Ric*_*ich 12 f# types type-inference

当我提出F#似乎不支持Infinite Types时,我正在Twitter上与Sadek Drobi聊天.事实证明,在C#中你可以沿着这些方向做点什么:

delegate RecDelegate<T> RecDelegate<T>(T x);
Run Code Online (Sandbox Code Playgroud)

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

明确:

type 'a specialF = 'a->specialF<'a>
Run Code Online (Sandbox Code Playgroud)

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

隐式:

let rec specialF (x: 'a) = specialF
Run Code Online (Sandbox Code Playgroud)

类型不匹配.期待'b但是给'a - >'b.在统一''b'和'' - >'b'时,结果类型将是无限的.

当然,这些是故意简单的样品.

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

kvb*_*kvb 7

你也可以这样做

type 'a RecType = RecType of ('a -> 'a RecType)
Run Code Online (Sandbox Code Playgroud)

创建一个命名类型,通过它来执行递归.现在这个工作:

let rec specialF = RecType (fun _ -> specialF)
Run Code Online (Sandbox Code Playgroud)


Bri*_*ian 6

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

我认为您需要一个可直接在CLI中表示的命名类型来中断递归,因此在F#中这意味着您还需要一个实际的委托类型.