Estoy probando lo que debería ser una aplicación de ejemplo realmente básica, pero este ejemplo particular de la introducción de F # de MS produce esta advertencia en intellisense:
Type mismatch. Expecting a ''a -> int' but given a ''a -> unit' The type 'int' does not match the type 'uint'F# Compiler1de este código: (fwiw, he intentado escribir tanto implícita como explícitamente para sum )
open System [<EntryPoint>] let main argv = printfn "Welcome to the calculator program" printfn "Type the first number" let firstNo = Console.ReadLine() printfn "Type the second number" let secondNo = Console.ReadLine() printfn "First %s, Second %s" firstNo secondNo let sum: int = 0 printfn "The sum is %i" sumLuego, cuando compilo, aparece este error, como se esperaba, basado en la advertencia:
error FS0001: Type mismatch. Expecting a↔ ''a -> int' ↔but given a↔ ''a -> unit' ↔The type 'int' does not match the type 'unit' [C:\Users\user-name\source\repos\MyFSharpApp\MyFSharpApp.fsproj]Siendo nuevo en F #, no estoy seguro de por qué la función printfn piensa que un int es una unidad y rompe la compilación. Realmente podría usar una explicación y/o enlace (s) a doc (s) de por qué este es el caso y cómo resolverlo.
Entonces, un punto interesante, incluso cuando elimino la interpolación por completo y solo imprimo una cadena, obtengo el mismo error. Así que no hay int en absoluto, pero la cadena espera un int en lugar de una unidad... pero, ¿por qué? Supongo que tengo algún tipo de error de sintaxis, independientemente de que esto parezca bastante extraño.
Se supone que la función main devuelve un int , que se convertirá en el resultado de la ejecución del programa. La convención es: cero para el éxito, distinto de cero para indicar un código de error (esto no es específico de F#).
Cuando crea un nuevo proyecto con dotnet new , como indican los ejercicios, la función main se genera devolviendo un cero.
Pero como ha confirmado en los comentarios, su función main actualmente no tiene un cero, lo que probablemente significa que la ha eliminado accidentalmente.
Simplemente agregue el cero nuevamente y el error desaparecerá.
En el nuevo y brillante .NET 6, el generador predeterminado genera un punto de entrada implícito en lugar de la buena función main , en cuyo caso no se requiere el valor de retorno, y si desea devolver uno, debe usar la exit función.
Sin embargo, esto claramente no se aplica a la pregunta actual, ya que el generador de OP generó una función main , no un punto de entrada implícito.