F # 1: Hola Mundo

Este texto es una traducción gratuita de una serie de artículos de Sacha Barber de Brighton, Reino Unido, que encontré bastante interesante.

Esta es la primera publicación de mi serie F #. Entonces, ¿qué vamos a cubrir? Como muchos programadores saben bien, es costumbre comenzar con el ejemplo de Hello World.

Entonces haremos exactamente eso. Entonces, sin más preámbulos, lo que necesita para crear una aplicación separada "Hello World" en F #.

Aquí esta:

open System [<EntryPoint>] let main argv = printfn "Hello World" Console.ReadLine() |> ignore 0 

// Desafortunadamente, no pude encontrar la asignación de código para F #

Esto puede no parecer suficiente para discutir, pero ya hay algo que considerar para sumergirse en algunos de los principios de F #.

Entonces, ¿qué está pasando exactamente aquí?

Dado que esta es una aplicación separada, obviamente necesitamos un punto de entrada (al igual que para cualquier otro lenguaje .NET).

Entonces, ¿cómo se determina el punto de entrada?

Bueno, es casi lo mismo que con otros lenguajes .NET, tenemos un método Main (o una función en terminología de F #) que toma una matriz de cadenas, y usamos el atributo [] para indicar que el método con este atributo es punto de entrada

El compilador y Visual Studio nos aman por esto.

Incluso en este ejemplo, debe escuchar las campanas de alarma o al menos una sensación de malentendido. Entonces, dijimos que hay una función inicial que toma una matriz de tipo de cadena. Todo lo que veo es una variable llamada "argv", que no veo declarada como una matriz. Esta variable "argv" es obviamente la matriz de cadenas que esperamos, pero por qué no tiene ningún tipo ... Mmm, interesante.

F # tiene un muy buen sistema de inferencia de tipos, lo que significa que en muchos casos puede omitir el tipo y F # lo generará correctamente. Por supuesto, aún puede declarar completamente el tipo de la variable de entrada si lo desea, donde generalmente toma la forma

(variableName: variableType)

Por lo tanto, tomando el ejemplo "argv" anterior, podríamos declarar el programa anterior de la siguiente manera, y eso sería bueno:

 open System [<EntryPoint>] let main (argv :string[]) = printfn "Hello World" Console.ReadLine() |> ignore 0 

Verá, hemos definido completamente el nombre de la variable de entrada con su tipo, que en este caso es una matriz de cadena [].

¿Qué más le interesa allí? Bueno, como dije, hay algo de qué hablar.

¿Por qué tengo una línea con este extraño |> ignorar al final. Que es esto

Bueno, dado que esta es una aplicación de consola F #, quería que la aplicación no se cerrara hasta que el usuario ingresara un carácter. Entonces necesito hacer 2 cosas:

  1. Abra el espacio de nombres "Sistema", que me permite usar los tipos de espacio de nombres "Sistema", como si estuviera usando "usar Sistema" en C # o "Sistema de importación" en VB .NET ".
  2. Dado que F # es un lenguaje funcional, se quejará si la función, en este caso "Console.ReadLine (...)", que puede devolver una cadena, no pasa el resultado a la función "ignorar", lo que en realidad significa return () (esta es la forma en F # dice nulo, pero se llama Unidad). Esto le dice explícitamente a F # que ignore el resultado de llamar al método Console.ReadLine (..).

Por ejemplo, así es como se verá el código si decido no incluir |> ignorar

imagen

El programador C # / VB.NET puede no ver lo que se dice aquí. Pero F # es bastante duro con lo que una función puede y no puede hacer. Y una cosa que SIEMPRE DEBE hacer una función es devolver un resultado. En el caso de la función "principal", el resultado esperado será un valor entero de 0.

Pero, ¿qué pasa con el caso de Console.ReadLine (..)?

Bueno, al menos en este caso, el resultado no importa mucho, y no estamos interesados ​​en él, y el programa seguirá funcionando bien si omitimos |> ignorar , pero si realmente no está interesado en el resultado, debe aprender a usar |> ignorar . En caso de que esté interesado, el operador de canalización "|>" dirigirá el valor de retorno de la expresión izquierda a la función derecha, que en este caso es igual a "aceptar el valor de retorno de Console.Readline (...) e ignorará cómo a nadie le importa" . No se preocupe si esto no significa nada para usted en esta etapa, hablaremos más sobre esto más adelante.

Lo último que necesito hacer es asegurarme de que la función F # siempre devuelva un valor, esto se hace en la línea donde solo ve la línea 0. Esto es suficiente para que F # entienda que este es el valor de retorno "0", que el sistema de inferencia de tipos saldrá, este es un valor Int de 0. La razón por la que el compilador de F # sabe que este es un valor de retorno es porque en este caso es la última instrucción, por lo que DEBE ser un valor de retorno. Obviamente, esto puede ser complicado usando lógica condicional si, de lo contrario, etc. Es importante tener en cuenta que en F # la función DEBE SIEMPRE devolver un valor, y en este caso, dado que el valor de 0 Int fue la última cadena encontrada (aunque todo podría ser más complicado), se utiliza como valor de retorno. Por supuesto, puede devolver Unit, que se realiza utilizando "()", que en realidad no devuelve nada (nulo si lo desea).

Otra cosa que me gustaría mencionar en este ejemplo trivial es que el espacio juega un papel clave en el desarrollo de F #.

Por ejemplo, supongamos que mi ejemplo trivial se ve así en un editor (en mi caso, Visual Studio 2012):

imagen

Este es un programa pequeño, y TODO lo que hice fue eliminar los espacios al comienzo de la línea printfn. Mmmm, parece que al compilador de F # no le gustó en absoluto. Sí, eso es justo.

En F #, un espacio es MUY MUY importante, así que juegue bien con él, de lo contrario, acostúmbrese a depurar errores crípticos como el que se muestra arriba, que es causado por un simple problema de espacio semántico incorrecto.

De todos modos, este es un ejemplo de "Hola Mundo". Hasta que nos veamos la próxima vez, les deseo lo mejor.

Source: https://habr.com/ru/post/470003/


All Articles