F#中的显式类型递归

Tho*_*ker 7 recursion f# type-systems

灵感来自这个问题:

F#中是否可以显式类型递归?

type 'a Mu = In of 'a Mu 'a

let unIn (In x) = x
Run Code Online (Sandbox Code Playgroud)

这段代码不幸地给出了"Type参数不能用作类型构造函数.

备注:例如,该构造用于具有重载和高阶多态的函数式编程.

用法示例(取自此处):

type ('a, 'b) ListX =
    | Nil
    | Cons of 'a * 'b

type 'a List = ListX Mu
Run Code Online (Sandbox Code Playgroud)

Bri*_*ian 8

不,这是不可能的.具体而言,F#中的泛型具有与CLR相同的限制,即<T>或<a>必须具有种类"*".同样的限制意味着你不能直接在F#中创建"类型类",因为例如"Monad m"会采用更高级的参数'm'(例如"* - >*",例如'list'和'option '可能是实例,每个实例都是泛型类型构造函数),但这是不允许的.