Introducción a F# en Visual Studio Code

Puede escribir F# en Visual Studio Code con el complemento Ionide para obtener una excelente experiencia multiplataforma y ligera del entorno de desarrollo integrado (IDE) con IntelliSense y refactorizaciones de código. Visite Ionide.io para obtener más información sobre el complemento.

Para empezar, asegúrese de que F# y el complemento Ionide están instalados correctamente.

Creación del primer proyecto con Ionide

Para crear un nuevo proyecto de F#, abra una línea de comandos y cree un proyecto con la CLI de .NET:

dotnet new console -lang "F#" -o FirstIonideProject

Una vez completado, cambie el directorio al proyecto y abra Visual Studio Code:

cd FirstIonideProject
code .

Después de que el proyecto se cargue en Visual Studio Code, debería ver abierto el panel de Explorador de soluciones de F# en el lado izquierdo de la ventana. Esto significa que Ionide ha cargado correctamente el proyecto que acaba de crear. Puede escribir código en el editor antes de este momento, pero una vez que este llegue, todo ha terminado de cargarse.

escritura del primer script

Una vez que haya configurado Visual Studio Code para usar el scripting de .NET Core, vaya a la vista Explorador en Visual Studio Code y cree un nuevo archivo. Asígnele el nombre MyFirstScript.fsx.

Agréguele el código siguiente:

let toPigLatin (word: string) =
    let isVowel (c: char) =
        match c with
        | 'a' | 'e' | 'i' | 'o' | 'u'
        | 'A' | 'E' | 'I' | 'O' | 'U' -> true
        |_ -> false
    
    if isVowel word[0] then
        word + "yay"
    else
        word[1..] + string(word[0]) + "ay"

Esta función convierte una palabra en una forma de Pig Latin, un argot lúdico del inglés. El siguiente paso consiste en evaluarla mediante F# interactivo (FSI).

Resalte toda la función (debe tener 11 líneas de longitud). Una vez resaltada, mantenga presionada la tecla Alt y presione Intro. Observará que una ventana de terminal aparece en la parte inferior de la pantalla. Debería tener un aspecto similar al siguiente:

Example of F# Interactive output with Ionide

Esto ha servido para que se hayan realizado tres pasos:

  1. Se ha iniciado el proceso de FSI.
  2. Se ha enviado el código resaltado al proceso de FSI.
  3. El proceso de FSI ha evaluado el código que envió.

Como lo que ha enviado es una función, ahora puede llamar a esa función con FSI. En la ventana interactiva, ejecute lo siguiente:

toPigLatin "banana";;

Debería ver el siguiente resultado:

val it: string = "ananabay"

Ahora, vamos a probar con una vocal como la primera letra. Escriba lo siguiente:

toPigLatin "apple";;

Debería ver el siguiente resultado:

val it: string = "appleyay"

Parece que la función responde según lo previsto. ¡Enhorabuena! Acaba de escribir su primera función de F# en Visual Studio Code y la ha evaluado con FSI.

Nota

Como quizá haya observado, las líneas de FSI finalizan con ;;. Esto se debe a que FSI le permite escribir varias líneas. El ;; del final sirve para que FSI sepa cuándo se ha completado el código.

Explicación del código

Si no tiene claro lo que hace realmente el código, le ofrecemos una explicación paso a paso.

Como puede ver, toPigLatin es una función que toma una palabra como entrada y la convierte en una representación en Pig-Latin de esa palabra. Las reglas de este proceso son las siguientes:

Si el primer carácter de una palabra es una vocal, añada "yay" al final de la palabra. Si no es una vocal, mueva el primer carácter al final de la palabra y añada “ay”.

Es posible que haya observado lo siguiente en FSI:

val toPigLatin: word: string -> string

Esto indica que toPigLatin es una función que toma string como entrada (denominada word), y devuelve otro string. Esto se conoce como la signatura de tipo de la función, una parte fundamental de F# que es clave para comprender su código. También observará esto si mantiene el puntero sobre la función en Visual Studio Code.

En el cuerpo de la función, observará dos partes distintas:

  1. Una función interna, denominada isVowel, que determina si un carácter determinado (c) es una vocal comprobando si coincide con uno de los patrones proporcionados a través de Coincidencia de patrones:

    let isVowel (c: char) =
        match c with
        | 'a' | 'e' | 'i' | 'o' | 'u'
        | 'A' | 'E' | 'I' | 'O' | 'U' -> true
        |_ -> false
    
  2. Una expresión if..then..else, que comprueba si el primer carácter es una vocal y construye un valor devuelto a partir de los caracteres de entrada, en función de si el primer carácter es una vocal o no:

    if isVowel word[0] then
        word + "yay"
    else
        word[1..] + string(word[0]) + "ay"
    

Por lo tanto, el flujo de toPigLatin es:

Compruebe si el primer carácter de la palabra de entrada es una vocal. Si es así, añada "yay" al final de la palabra. De lo contrario, mueva ese primer carácter al final de la palabra y añada "ay".

Hay un último aspecto que se debe tener en cuenta: en F#, no hay una instrucción explícita que la función tenga que devolver. Esto se debe a que F# está basado en expresiones y la última expresión evaluada en el cuerpo de una función determina el valor devuelto de esa función. Dado que if..then..else es en sí misma una expresión, la evaluación del cuerpo del bloque then o el cuerpo del bloque else determina el valor devuelto por la función toPigLatin.

Convertir la aplicación de consola en un generador de Pig Latin

En las secciones anteriores de este artículo se mostró un primer paso común al escribir código de F#: escribir una función inicial y ejecutarla de forma interactiva con FSI. Esto se conoce como desarrollo controlado por REPL, donde REPL significa "Read-Evaluate-Print Loop" (bucle de lectura, evaluación e impresión). Es una excelente manera de experimentar con la funcionalidad hasta que tenga algo en funcionamiento.

El siguiente paso en el desarrollo controlado por REPL es mover código operativo a un archivo de implementación de F#. Así, el compilador de F# puede compilarlo en un ensamblado que se pueda ejecutar.

Para empezar, abra el archivo Program.fs que creó anteriormente con la CLI de .NET. Podrá ver que ya tiene algo de código.

A continuación, cree un nuevo module llamado PigLatin y copie ahí la función toPigLatin que creó anteriormente, tal y como está:

module PigLatin =
    let toPigLatin (word: string) =
        let isVowel (c: char) =
            match c with
            | 'a' | 'e' | 'i' | 'o' | 'u'
            | 'A' | 'E' | 'I' | 'O' | 'U' -> true
            |_ -> false
        
        if isVowel word[0] then
            word + "yay"
        else
            word[1..] + string word[0] + "ay"

Este módulo debe estar por encima de la función main y por debajo de la declaración open System. El orden de las declaraciones es importante en F#, por lo que deberá definir la función antes de llamarla en un archivo.

Luego, en la función main, llame a la función de generador de Pig Latin en los argumentos:

[<EntryPoint>]
let main args =
    for arg in args do
        let newArg = PigLatin.toPigLatin arg
        printfn "%s in Pig Latin is: %s" arg newArg

    0

Ahora puede ejecutar la aplicación de consola desde la línea de comandos:

dotnet run apple banana

Y verá que genera el mismo resultado que el archivo de script, pero esta vez como un programa en ejecución.

Solución de problemas de Ionide

Estas son algunas maneras de solucionar ciertos problemas que puede encontrar:

  1. Para obtener las características de edición de código de Ionide, los archivos de F# deben guardarse en el disco y dentro de una carpeta que esté abierta en el área de trabajo de Visual Studio Code.
  2. Si ha realizado cambios en el sistema o ha instalado requisitos previos de Ionide con Visual Studio Code abierto, reinicie Visual Studio Code.
  3. Si tiene caracteres no válidos en los directorios del proyecto, Ionide podría no funcionar. Cambie el nombre de los directorios del proyecto si este es el caso.
  4. Si ninguno de los comandos de Ionide funciona, compruebe los Enlaces de teclado de Visual Studio Code para ver si los está invalidando sin querer.
  5. Si Ionide está defectuoso en la máquina y ninguna de las opciones anteriores ha corregido el problema, pruebe a quitar el directorio ionide-fsharp en la máquina y reinstale el conjunto de complementos.
  6. Si un proyecto no se pudo cargar (el Explorador de soluciones de F# se lo mostrará si es así), haga clic con el botón derecho en ese proyecto y haga clic en Ver detalles para obtener más información de diagnóstico.

Ionide es un proyecto de código abierto creado y mantenido por los miembros de la comunidad de F#. Informe sobre los problemas que le surjan y no dude en contribuir en el repositorio de GitHub ionide-vscode-fsharp.

También puede solicitar más ayuda de los desarrolladores de Ionide y la comunidad de F# en el canal de Gitter para Ionide.

Pasos siguientes

Para más información sobre F# y sus características como lenguaje, consulte Recorrido por F#.