F # 1: Olá mundo

Este texto é uma tradução gratuita de uma série de artigos de Sacha Barber de Brighton, Reino Unido, que achei bastante interessantes.

Este é o primeiro post da minha série F #. Então, o que vamos cobrir? Como muitos programadores sabem bem, é habitual começar com o exemplo Hello World.

Então, faremos exatamente isso. Portanto, sem mais delongas, o que você precisa para criar um aplicativo separado "Hello World" em F #.

Aqui está:

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

// Infelizmente, não foi possível encontrar a alocação de código para F #

Isso pode não parecer suficiente para discutir, mas já há algo a considerar para se imergir em alguns dos princípios do F #.

Então, o que exatamente está acontecendo aqui?

Como esse é um aplicativo separado, obviamente precisamos de um ponto de entrada (assim como em qualquer outra linguagem .NET).

Então, como é determinado o ponto de entrada?

Bem, é quase o mesmo que em outras linguagens .NET, temos um método Main (ou uma função na terminologia F #) que utiliza uma matriz de strings e usamos o atributo [] para indicar que o método com este atributo é ponto de entrada.

O compilador e o Visual Studio nos amam por isso.

Mesmo neste exemplo, você deve ouvir sinais de alarme ou pelo menos algum sentimento de mal-entendido. Então, dissemos que existe uma função inicial que aceita uma matriz do tipo string. Tudo o que vejo é uma variável chamada "argv", que não vejo declarada como uma matriz. Essa variável "argv" é obviamente a matriz de strings que esperamos, mas por que ela não tem tipo .... Mmm, interessante.

O F # possui um sistema de inferência de tipo muito bom, o que significa que, em muitos casos, você pode omitir o tipo e o F # o produzirá corretamente. Obviamente, você ainda pode declarar completamente o tipo da variável de entrada, se desejar, onde geralmente assume o formato

(variableName: variableType)

Portanto, usando o exemplo "argv" acima, poderíamos declarar o programa acima da seguinte maneira, e isso seria bom:

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

Veja bem, definimos completamente o nome da variável de entrada com seu tipo, que neste caso é uma matriz de string [].

O que mais interessa lá? Bem, como eu disse, há algo para conversar.

Por que eu tenho uma linha com esse estranho |> ignorar no final. O que é isso

Bem, como esse é um aplicativo de console F #, eu queria que o aplicativo não fosse desligado até o usuário inserir um caractere. Então, eu preciso fazer duas coisas:

  1. Abra o espaço para nome "Sistema", que me permite usar os tipos de espaço para nome "Sistema", como se eu estivesse usando "usando Sistema" em C # ou "Imports System" no VB .NET. "
  2. Como o F # é uma linguagem funcional, ele reclamará se a função, neste caso "Console.ReadLine (...)", que pode retornar uma string, não passa o resultado para a função "ignorar", que na verdade significa return () (este é o caminho em F # diz nulo, mas chama Unidade). Isso informa explicitamente ao F # para ignorar o resultado da chamada do método Console.ReadLine (..).

Por exemplo, aqui está a aparência do código se eu decidir não incluir |> ignorar

imagem

O programador C # / VB.NET pode não ver o que está sendo dito aqui. Mas o F # é bastante difícil quanto ao que uma função pode ou não fazer. E uma coisa que uma função DEVE SEMPRE fazer é retornar um resultado. No caso da função "principal", o resultado esperado será um valor inteiro 0.

Mas e o caso do Console.ReadLine (..)?

Bem, pelo menos nesse caso, o resultado não importa muito, e não estamos interessados ​​nele, e o programa ainda funcionará bem se ignorarmos |> ignorar , mas se você realmente não estiver interessado no resultado, deve aprender a usar |> ignore . Caso você esteja interessado, o operador de pipeline "|>" direcionará o valor de retorno da expressão esquerda para a função correta, que nesse caso é igual a "aceitar o valor de retorno do Console.Readline (...) e ignorar como ninguém se importa com isso" . Não se preocupe se isso não significar nada para você nesta fase, falaremos mais sobre isso mais tarde.

A última coisa que preciso fazer é garantir que a função F # sempre retorne um valor, isso é feito na linha em que você apenas vê a linha 0. Isso é suficiente para o F # entender que esse é o valor de retorno "0", que é o sistema de inferência de tipo será emitido, este é um valor Int igual a 0. O motivo pelo qual o compilador F # sabe que esse é um valor de retorno é porque, nesse caso, é a última instrução, portanto, DEVE ser um valor de retorno. Obviamente, isso pode ser complicado usando a lógica condicional se, mais, etc. É importante observar que em F # a função DEVE SEMPRE retornar um valor e, nesse caso, como o valor de 0 Int foi a última string encontrada (embora tudo possa ser mais complicado), ela é usada como valor de retorno. Obviamente, você pode retornar Unit, o que é feito usando "()", que na verdade não retorna nada (void se você quiser).

Outra coisa que gostaria de mencionar neste exemplo trivial é que o espaço desempenha um papel fundamental no desenvolvimento do F #.

Por exemplo, suponha que meu exemplo trivial tenha esta aparência em um editor (no meu caso, Visual Studio 2012):

imagem

Este é um pequeno programa, e tudo o que fiz foi remover os espaços no início da linha printfn. Mmmm, parece que o compilador F # não gostou nada disso. Sim, isso é justo.

No F #, um espaço é MUITO MUITO importante; portanto, brinque com ele, caso contrário, acostume-se a depurar erros criptográficos como o mostrado acima, causado por um simples problema de espaço semântico incorreto.

Enfim, este é um exemplo de "Hello World". Até nos encontrarmos da próxima vez, desejo tudo de bom a você.

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


All Articles