无限类型(又称递归类型)在F#中不可能吗?

无限类型(又称递归类型)在F#中不可能吗?,f#,types,type-inference,F#,Types,Type Inference,我在推特上聊天时被问及F#似乎不支持无限类型。事实证明,在C#中,你可以按照以下思路做一些事情: delegate RecDelegate<T> RecDelegate<T>(T x); 类型不匹配。期待a'b,但是 给定一个“a->”b。结果类型 当统一“b”时将是无限的 和“a->”b“ 当然,这些都是有意设计的简单样本 我想知道我是不是搞错了。也许我错过了一些必要的注释类型?类型d您还可以执行以下操作 type d<'T> = delegate of

我在推特上聊天时被问及F#似乎不支持无限类型。事实证明,在C#中,你可以按照以下思路做一些事情:

delegate RecDelegate<T> RecDelegate<T>(T x);
类型不匹配。期待a'b,但是 给定一个“a->”b。结果类型 当统一“b”时将是无限的 和“a->”b“

当然,这些都是有意设计的简单样本


我想知道我是不是搞错了。也许我错过了一些必要的注释类型?

类型d您还可以执行以下操作

type d<'T> = delegate of 'T -> d<'T>  //'
let del : d<int> = null
let anotherDel = del.Invoke(1).Invoke(2).Invoke(3)
type 'a RecType = RecType of ('a -> 'a RecType)
创建用于执行递归的命名类型。现在,这项工作:

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

递归记录类型也应该起作用

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

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

这里有实际的应用程序吗,或者这个问题只是为了好玩而调查的结果吗?据我所知,没有实际的参考透明应用程序。然而,一个例子是,对于某种封闭的可变状态,这对于重复的应用程序是有用的。示例:添加(1)(2)(3)(4)--其中可以执行任意数量的应用程序。下面是我编写的一个OCaml程序,它使用此功能来避免使用矩形的间接寻址。如果更通用的版本有效,我也会感兴趣:
let rec specialF = RecType (fun _ -> specialF)
type A = { A : A }
let rec a : A = { A = a }