Me gustaría usar Spectre.Console en una aplicación de consola F#. Estoy tratando de convertir el ejemplo de Introducción de C# a F#. A continuación se muestra mi intento:
open System open Spectre.Console.Cli type AddSettings() = inherit CommandSettings() [<CommandArgument(0, "[PROJECT]")>] member val Project = "" with get, set type AddPackageSettings() = inherit AddSettings() [<CommandArgument(0, "<PACKAGE_NAME>")>] member val PackageName = "" with get, set [<CommandOption("-v|--version <VERSION>")>] member val Version = "" with get, set type AddReferenceSettings() = inherit AddSettings() [<CommandArgument(0, "<PROJECT_REFERENCE>")>] member val ProjectReference = "" with get, set type AddPackageCommand() = inherit Command<AddPackageSettings>() override _.Execute (context, settings) = 0 type AddReferenceCommand() = inherit Command<AddReferenceSettings>() override _.Execute(context, settings) = 0 // Define a function to construct a message to print let from whom = sprintf "from %s" whom [<EntryPoint>] let main argv = let message = from "F#" // Call the function let app = CommandApp() app.Configure(fun config -> config.AddBranch<AddSettings>("add", fun add -> add.AddCommand<AddPackageCommand>("package") add.AddCommand<AddReferenceCommand>("reference") ) ) app.Run(argv)Desafortunadamente, recibo el siguiente error del compilador:
The type 'AddPackageCommand' is not compatible with the type 'ICommandLimiter<AddSettings>'Gracias por cualquier ayuda.
Así es como resolví ese problema:
interface ICommandLimiter<AddSettings> a las subclases de Command que usan la herencia en la configuración de AddSettings .AddBranch para inferir el argumento genérico simplemente anotando el tipo de IConfigurator : config.AddBranch("add", fun (add: IConfigurator<AddSettings>) -> ... . open System open Spectre.Console.Cli type AddSettings() = inherit CommandSettings() [<CommandArgument(0, "[PROJECT]")>] member val Project = "" with get, set type AddPackageSettings() = inherit AddSettings() [<CommandArgument(0, "<PACKAGE_NAME>")>] member val PackageName = "" with get, set [<CommandOption("-v|--version <VERSION>")>] member val Version = "" with get, set type AddReferenceSettings() = inherit AddSettings() [<CommandArgument(0, "<PROJECT_REFERENCE>")>] member val ProjectReference = "" with get, set type AddPackageCommand() = inherit Command<AddPackageSettings>() interface ICommandLimiter<AddSettings> override _.Execute (context, settings) = 0 type AddReferenceCommand() = inherit Command<AddReferenceSettings>() interface ICommandLimiter<AddSettings> override _.Execute(context, settings) = 0 // Define a function to construct a message to print let from whom = sprintf "from %s" whom [<EntryPoint>] let main argv = let message = from "F#" // Call the function let app = CommandApp() app.Configure(fun config -> config.AddBranch("add", fun (add: IConfigurator<AddSettings>) -> add.AddCommand<AddPackageCommand>("package") |> ignore add.AddCommand<AddReferenceCommand>("reference") |> ignore ) ) app.Run(argv)