F # proveedor de tipos: "solo devolver tipos generados"

Intentando codificar números peano de nivel de tipo utilizando un proveedor de tipos:

namespace TypeProviderPlayground

open System
open Microsoft.FSharp.Core.CompilerServices
open System.Runtime.CompilerServices

[<assembly: TypeProviderAssembly()>]
do()

type Z = class end
type 'a S = class end
type N = class end

[<TypeProvider>]
type PeanoProvider(s: TypeProviderConfig) =
    let invalidate = Event<_,_>()
    interface ITypeProvider with
        member x.ApplyStaticArguments(typeWithoutArguments, typeNameWithArguments, staticArguments) =
            let n : int = unbox staticArguments.[0]
            [1..n] |> List.fold (fun s _ -> typedefof<S<_>>.MakeGenericType [| s |]) typeof<Z>
        member x.GetNamespaces() = 
            let ns = 
                { new IProvidedNamespace with
                    member x.GetNestedNamespaces() = [||]
                    member x.GetTypes() = [||]
                    member x.ResolveTypeName t =
                        if t = "N"
                            then typeof<N>
                            else null
                    member x.NamespaceName = "Peano" }
            [| ns |]
        member x.GetStaticParameters t =
            let p = 
                { new Reflection.ParameterInfo() with
                    member z.Name = "number"
                    member z.ParameterType = typeof<int> }
            [| p |]

        [<CLIEvent>]
        member x.Invalidate = invalidate.Publish
        member x.Dispose() = ()
        member x.GetInvokerExpression(syntheticMethodBase, parameters) = 
            raise <| NotImplementedException()

LosN type es solo un maniquí, de lo contrario no podría hacer que pasara por el proveedor de tipos. Código de consumidor:

open TypeProviderPlayground

[<Generate>]
type S<'a> = Peano.N<5>

Y obtengo este error:

error FS3152: The provider 'TypeProviderPlayground.PeanoProvider' returned a non-generated type
'TypeProviderPlayground.S`1[[TypeProviderPlayground.S`1[[TypeProviderPlayground.S`1[[TypeProviderPlayground.S`1[[TypeProviderPlayground.S`1[[TypeProviderPlayground.Z, TypeProviderPlayground, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]], TypeProviderPlayground, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]], TypeProviderPlayground, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]], TypeProviderPlayground, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]], TypeProviderPlayground, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]' 
in the context of a [<Generate>] declaration. Either remove the [<Generate>] declaration or adjust the type provider to only return generated types. 

Que dice que el tipo se construyó correctamente Z S S S S S) pero por alguna razón el compilador no lo aceptará como un "tipo generado".

Si elimino la[<Generated>] atributo Recibo otro error que me dice que lo agregue.

Significa esto que los proveedores de tipos solo trabajarán en tipos emitidos dinámicamente (lo que parece un requisito extraño a primera vista)?

Además, si lo hago:

[<Generate>]
type WW<'a> = Peano.N<5>

Recibo un error que dice queWW'1e esperaba @ peroS'1 fue devuelto. ¿Por qué el tipo devuelto (por el proveedor de tipos) tiene que coincidir con el nombre de tipo que declaro en el consumidor?

Respuestas a la pregunta(2)

Su respuesta a la pregunta