Поставщик типа F # - «возвращать только сгенерированные типы»

Попытка закодировать числа peano уровня типа с помощью провайдера типов:

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()

N type - это просто пустышка, иначе я не смог бы пройти через провайдера типов. Код потребителя:

open TypeProviderPlayground

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

И я получаю эту ошибку:

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. 

Который говорит, что тип был правильно построен (Z S S S S S) но по какой-то причине компилятор не примет его как «сгенерированный тип».

Если я удалю[<Generated>] Атрибут Я получаю другую ошибку, говорящую мне добавить это.

Означает ли это, что поставщики типов будут работать только с динамически выдаваемыми типами (что на первый взгляд кажется странным требованием)?

Кроме того, если я сделаю:

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

Я получаю сообщение об ошибке, чтоWW'1 ожидалось, ноS'1 был возвращен. Почему возвращаемый тип (от поставщика типов) должен соответствовать имени типа, которое я объявляю в потребителе?

Ответы на вопрос(2)

Ваш ответ на вопрос