F#中的显式类型递归

时间:2009-08-10 06:30:35

标签: f# recursion type-systems

灵感来自this question

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

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

let unIn (In x) = x

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

备注:例如,本文Functional Programming with Overloading and Higher-Order Polymorphism中使用了此构造。

使用示例(取自here):

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

type 'a List = ListX Mu

1 个答案:

答案 0 :(得分:8)

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