F# 5: Uma nova era de programação funcional com .LÍQUIDO
Resumo:
1. F# 5 é a próxima versão principal do idioma F#.
2. F# 5 marca o fim da era atual e o início de um novo.
3. F# 5 se concentra na programação interativa, programação orientada para analíticos e programação funcional.
4. F# Interactive (FSI) é uma ferramenta desenvolvida para desenvolvimento iterativo e interativo.
5. F# 5 mantém as principais experiências do FSI, incluindo assemblies de referência e chamadas.
6. O suporte ao gerenciamento de pacotes é introduzido no FSI, permitindo uma referência mais fácil de pacotes NUGET.
7. F# 5 agora suporta referenciar qualquer pacote NUGET em um script F#.
8. O FSI restaura e refere -se automaticamente a todos os conjuntos no pacote.
9. F# 5 apresenta o Dotnet FSI, disponibilizando o FSI no macOS e Linux.
10. O suporte F# é adicionado nos notebooks Jupyter para programação interativa.
Perguntas únicas:
1. O que é f# 5?
Responder: F# 5 é a próxima versão principal do idioma F#.
2. O que F# 5 marca o fim de?
Responder: F# 5 marca o fim da era atual.
3. Quais são as três principais áreas de foco para f# 5?
Responder: As três principais áreas de foco para F# 5 são programação interativa, programação orientada para analíticas e programação funcional.
4. O que é f# interativo (fsi)?
Responder: FSI é uma ferramenta desenvolvida para desenvolvimento iterativo e interativo usando F#.
5. Que experiências F# 5 mantêm do FSI?
Responder: F# 5 mantém as principais experiências do FSI, incluindo assemblies de referência e chamadas.
6. O que o suporte ao gerenciamento de pacotes no FSI permite?
Responder: O suporte ao gerenciamento de pacotes no FSI permite uma referência mais fácil de pacotes Nuget em scripts F#.
7. Como F# 5 suporta referenciando pacotes de nuget?
Responder: F# 5 permite fazer referência a qualquer pacote NUGET em um script F#, e o FSI restaura e refere -se automaticamente a todos os conjuntos no pacote.
8. O que é DOTNET FSI?
Responder: Dotnet FSI é um comando que disponibiliza o FSI no macOS e Linux.
9. Qual suporte adicional f# 5 introduz para programação interativa?
Responder: F# 5 apresenta suporte F# em notebooks Jupyter para programação interativa.
10. Como a programação interativa em F# mudou recentemente?
Responder: A programação interativa em F# expandiu -se com a introdução de gerenciamento de pacotes, DOTNET FSI e F# Suporte nos notebooks Jupyter.
11. Qual é o significado de f# 1.0 e FSI?
Responder: F# 1.0 foi o lançamento inicial da linguagem F#, e o FSI (F# interativo) foi desenvolvido ao lado dele para desenvolvimento interativo.
12. Em que plataformas está FSI agora disponível?
Responder: O FSI já está disponível no macOS e Linux, além do Windows.
13. Como F# 5 facilita o gerenciamento de pacotes?
Responder: F# 5 Simplifica o gerenciamento de pacotes, permitindo fácil referência de pacotes de nuget e lidar automaticamente em suas montagens.
14. Qual é o objetivo do DOTNET FSI?
Responder: O DOTNET FSI permite o uso do FSI para todas as mesmas tarefas no macOS e Linux que no Windows.
15. Como F# 5 reconhece e lida com diferentes tipos de pacotes?
Responder: F# 5 pode lidar com pacotes com dependências e pacotes nativos que requerem ordem de referência de montagem específica no FSI.
F# Linguagem de programação: histórico, benefícios e possibilidades futuras
Vários itens
Exceção de tipo =
NOVO: Unidade -> Exceção + 2 sobrecargas
Dados dos membros: Idictionary
membro getBaseexception: unidade -> Exceção
Membro GetObjectData: Info: SerializationInfo * Contexto: StreamingContext -> Unidade
Membro GetType: Unidade -> Tipo
Helplink de membros: string with get, set
Membro Innerexception: Exceção
Mensagem do membro: string
fonte de membro: string com get, set
Membro Stacktrace: String
.
F# 5: Uma nova era de programação funcional com .LÍQUIDO
Na equipe F# da Microsoft, estamos constantemente melhorando a linguagem F# para capacitar os desenvolvedores a fazer programação funcional .LÍQUIDO. Nos quatro lançamentos anteriores, de 2017 até agora, estamos em uma longa jornada para tornar F# incrível em .Núcleo líquido. Renovamos o compilador F# e a biblioteca principal para executar o suporte de plataforma cruzada, adicionar suporte para programação de extensão e baixo nível e plataforma cruzada e adicionamos a capacidade de visualizar os recursos de linguagem que podem ser enviados .Lançamentos de visualização líquida.
Com o .Lançamento da rede 5, estamos lançando f# 5, a próxima versão principal do idioma F#. Mas F# 5 não é apenas um pacote de recursos que aparecem para o passeio com .Net 5. F# 5 marca o fim da era atual ? trazendo suporte para .Núcleo líquido ? e o começo de um novo. Com F# 5, estamos considerando nossa jornada para trazer F# para .Núcleo líquido principalmente completo. Com F# 5, nosso foco muda de .NET NUDE para três áreas principais:
- Programação interativa
- Tornando a programação orientada a analítica conveniente e divertido
- Grandes fundamentos e desempenho para programação funcional em .LÍQUIDO
Neste artigo, vou passar pelo idioma F# e dos recursos de ferramentas que implementamos para o F# 5 e explicará como eles se alinham com nossos objetivos.
F# 5 faz da programação interativa uma alegria
F# tem uma longa história de ser interativa. De fato, quando f# 1.0 foi desenvolvido, uma ferramenta chamada F# Interactive (FSI) foi desenvolvida para a eventual lançamento do F# 1.0 em 2006. Isso coincidiu com a primeira integração de ferramentas no Visual Studio. O FSI foi usado bastante no marketing inicial de F# (como mostrado em figura 1) para demonstrar o desenvolvimento iterativo e interativo de aplicativos do Windows forms, cenas gráficas e jogos no Windows.
As experiências centrais do FSI permaneceram as mesmas em F# 5. Esses incluem:
- A capacidade de fazer referência e chamar para montagens em seu computador
- A capacidade de carregar outros scripts F# para executar como uma coleção de scripts
- Integração com Visual Studio
- A capacidade de personalizar a saída
No entanto, como f# e o .O ecossistema líquido mudou de assemblies em um computador para pacotes instalados por meio de um gerenciador de pacotes, muitos desenvolvedores de F# usando FSI para várias tarefas se irritam por ter que baixar manualmente um pacote e referenciar suas assembléias manualmente. Além disso, como .O alcance da Net estendido além do Windows, desenvolvedores no MacOS ou Linux se viu ausentes e confiando em uma instalação mono para usar o FSI em seus ambientes.
Introdução ao suporte ao gerenciamento de pacotes no FSI
Usar um pacote em um script F# tem sido uma fonte de frustração para os programadores F#. Eles normalmente baixavam pacotes e referenciados assemblies no caminho para o pacote manualmente. Um conjunto menor de programadores F# usou o Paket gerente de pacotes e gerou um “carregar script” ? Um recurso em Paket que gera um arquivo de script F# com referências a todos os assemblies nos pacotes que você deseja referência ? e carrega esse script em seus scripts F# funcionando. No entanto, como o Paket é uma alternativa ao NUGET em vez de uma ferramenta padrão, a maioria dos programadores F# não a usa.
Agora com F# 5, você pode simplesmente fazer referência a qualquer pacote NUGET em um script F#. O FSI restaura este pacote com o NUGET e referencia automaticamente todas as montagens no pacote. Aqui está um exemplo:
#R "NUGET: Newtonsoft.JSON "Open Newtonsoft.JSON Let O = <| X = 2; Y = "Hello" |>printfn "%s" (jsonConvert.SerializeObject O)
Ao executar o código nesse snippet, você verá a seguinte saída:
Val O: <| X: int; Y: string |>= < X = 2 Y = "Hello" >Val It: Unit = ()
O recurso de gerenciamento de pacotes pode lidar praticamente qualquer coisa que você queira jogar nele. Ele suporta pacotes com dependências nativas como ML.Rede ou virar. Ele também suporta pacotes como o FPARSEC, que anteriormente exigiam que cada montagem no pacote seja referenciado em uma ordem específica no FSI.
Apresentando o DOTNET FSI
A segunda grande frustração para os programadores F# usando o FSI é que ele estava faltando em .Núcleo líquido por um longo tempo. A Microsoft lançou uma versão inicial do FSI para .Núcleo líquido com .Net Core 3.0, mas foi útil apenas para scripts F# que não incorporaram nenhuma dependência. Agora, em conjunto com o gerenciamento de pacotes, você pode usar o FSI para todas as mesmas tarefas no MacOS ou Linux que faria no Windows (exceto no lançamento de aplicativos WinForms e WPF, por razões óbvias). Isso é feito com um único comando: dotnet fsi .
Apresentando o suporte F# em notebooks Jupyter
Não há dúvida de que o gerenciamento de pacotes e disponibilizar o FSI em todos os lugares tornam F# melhor para programação interativa. Mas a Microsoft sentiu que poderíamos fazer mais do que apenas isso. A programação interativa explodiu nos últimos anos na comunidade Python, graças em grande parte aos notebooks Jupyter. A comunidade F# havia construído apoio inicial ao F# em Jupyter há muitos anos, então trabalhamos com seu mantenedor atual para aprender sobre o que uma boa experiência para Jupyter significava e construímos.
Agora, com F# 5, você pode extrair pacotes, inspecionar dados e mapear os resultados de sua experimentação em um notebook compartilhável e cruzado que qualquer pessoa pode ler e ajustar, como mostrado em Figura 2.
Outra razão pela qual estamos muito empolgados com o suporte F# nos notebooks Jupyter é que os notebooks são fáceis de compartilhar com outras pessoas. Notebooks de Juputer render. Eles não são apenas uma ferramenta de programação, mas também produzem um documento que pode ser usado para instruir outras pessoas a executar tarefas, compartilhar descobertas, aprender uma biblioteca ou até aprender F#!
Apresentando o suporte F# no Visual Studio Code Notebooks
F# Suporte em notebooks Jupyter traz interatividade a um nível totalmente novo. Mas Jupyter não é a única maneira de programar para um caderno. O Código do Visual Studio também está trazendo programação de notebooks para a dobra, com todo o poder de um serviço de idioma que você esperaria encontrar ao editar o código em um arquivo normal. Com o suporte F# nos notebooks do Visual Studio, você pode desfrutar da integração de serviços de idiomas ao criar um notebook, como mostrado em Figura 3.
Outro benefício dos notebooks de código do Visual Studio é o formato de arquivo, que foi projetado para ser legível por humanos e fácil de diferenciar no controle de fonte. Ele suporta a importação de notebooks Jupyter e exportar notebooks de código do Visual Studio como notebooks Jupyter, como você pode ver em Figura 4.
Você pode fazer muitas coisas com F# no Código do Visual Studio e notebooks Jupyter, e estamos procurando expandir os recursos além do que foi descrito até agora. Nosso roteiro inclui integração com várias outras ferramentas, visualização de dados mais coesos e interopado de dados com o Python.
F# 5 estabelece mais fundações para programação analítica
Um paradigma de crescente importância na era do onipresente aprendizado de máquina e ciência de dados é o que eu gosto de ligar “Programação analítica.” Esse paradigma não é exatamente novo, embora existam novas técnicas, bibliotecas e estruturas que saem todos os dias para avançar ainda mais o espaço. A programação analítica tem tudo a ver com analisar e manipular dados, geralmente aplicando técnicas numéricas para fornecer informações. Isso varia de importar um CSV e calcular uma regressão linear nos dados às redes neurais mais avançadas e intensivas em computação que saem das instituições de pesquisa da IA.
F# 5 representa o início de nossa incursão neste espaço. A equipe da Microsoft acha que F# já é ótimo para manipular dados, pois inúmeros usuários de F# demonstraram usando F# para exatamente esse fim. F# também tem um ótimo suporte para programação numérica com alguns tipos e funções internos e uma sintaxe que é acessível e sucinta. Então, mantivemos isso em mente e identificamos mais algumas áreas para melhorar.
Comportamento consistente com fatias
Uma operação muito comum realizada na programação analítica está tomando uma fatia de uma estrutura de dados, principalmente as matrizes. Flices F# costumava se comportar inconsistentemente, com alguns comportamentos fora dos limites resultando em uma exceção de tempo de execução e outros resultando em uma fatia vazia. Mudamos todas as fatias para tipos intrínsecos F# – matrizes, listas, strings, matrizes 3D e matrizes 4D – para retornar uma fatia vazia para qualquer fatia que você possa especificar que não poderia existir:
Seja L = [1..10] Seja a = [| 1..10 |] Vamos s = "Olá!"// antes: Lista vazia // f# 5: o mesmo deixa em esvazia = l.[-2..(-1)] // antes: lançaria a exceção // f# 5: matriz vazia, deixando emptyArray = a.[-2..(-1)] // antes: lançaria a exceção // f# 5: string vazia, deixe esvaziar.[-2..(-1)]
O raciocínio para isso é em grande parte porque em F#, fatias vazias compõem com fatias não vazias. Uma corda vazia pode ser adicionada a uma corda não vazia, matrizes vazias podem ser anexadas a matrizes não vazias, etc. Essa mudança é não quebrável e permite previsibilidade no comportamento.
Fatia de índice fixo para matrizes 3D e 4D
F# tem suporte interno para matrizes 3D e 4D. Esses tipos de matriz sempre suportaram fatia e indexação, mas nunca o fatiamento com base em um índice fixo. Com F# 5, isso agora é possível:
// Primeiro, crie uma matriz 3D com valores de 0 a 7 Let Dim = 2 Let M = Array3D.Zerocreate Dim Dim Dim, deixe mutável cnt = 0 para z em 0..Dim-1 do Y em 0..Dim-1 do x em 0..Dim-1 do m.[x, y, z]
Isso ajuda a completar a imagem para cortar cenários com matrizes 3D e 4D.
Visualização: índices reversos
A Microsoft também está introduzindo a capacidade de usar índices reversos, que podem ser usados com fatias, como uma prévia em F# 5. Para usá -lo, basta colocar
Seja xs = [1..10] // Obtenha o elemento 1 do final: XS.[^1] // maneira antiga de obter os dois últimos elementos LettwooldStyle = xs.[(XS.Comprimento-2)..] // nova maneira de obter os dois últimos elementos Let LastTwonewstyle = Xs.[^1..] lasttwooldstyle = lasttwonewstyle // true
Você também pode definir seus próprios membros por meio de uma extensão do tipo F# para aumentar esses tipos para suportar flaing f# e índices reversos. O exemplo a seguir o faz com o tipo de extensão:
Open System Type Span com membro SP.Getslice (startIdx, endIdx) = vamos s = defaultArg startIdx 0 Let e = defaultArg endidx sp.Comprimento sp.Slice (S, E - S) Membro SP.GetReverSindex (_, deslocamento: int) = sp.Comprimento - deslocamento Deixe SP = [| 1; 2; 3; 4; 5 |].Asspan () sp.[[..^2] // [| 1; 2; 3 |]
F# Tipos intrínsecos têm índices reversos incorporados. Em uma versão futura de F#, também apoiaremos integral com o sistema.Índice e sistema.Intervalo, nesse ponto, o recurso não estará mais em visualização.
Cotações de código aprimoradas
F# citações de código são um recurso de metaprogramação que permite manipular a estrutura do código F# e avaliá -lo em um ambiente de sua escolha. Essa capacidade é essencial para o uso de F# como uma linguagem de construção de modelo para tarefas de aprendizado de máquina, onde o modelo de IA pode ser executado em hardware diferente, como uma GPU. Uma peça crítica faltando nesse quebra -cabeça tem sido a capacidade de representar fielmente as informações de restrição do tipo F#, como as usadas na aritmética genérica, na citação F# para que um avaliador possa saber aplicar essas restrições no ambiente que está avaliando em.
Começando com F# 5, as restrições agora são mantidas em citações de código, desbloqueando a capacidade de certas bibliotecas como o DiffSharp usar essa parte do sistema de tipo F# a seu proveito. Uma maneira simples de demonstrar este é o seguinte código:
FSHARP aberto.Linq.RuntimeHelpers Let Eval q = LeeFexpressionConverter .Avalie o QUOTAÇÃO q Deixe a inline negar x = -x // crucialmente, 'negar' tem // a seguinte assinatura: // // Val inline nega: // x: ^a -> ^a // Quando ^a: // (membro estático (~ -): ^a -> ^a) // // Essa restrição é crítica a# Tipo de segurança // e agora é . |> aval
O uso de um operador aritmético implica uma restrição de tipo de que todos os tipos passados para negar devem apoiar o ? operador. Este código falha no tempo de execução porque a cotação do código não mantém essas informações de restrição; portanto, avaliá -lo, lança uma exceção.
As citações de código são a base para um trabalho mais pesado em P&D para usar o F# como um idioma para criar modelos de IA e, portanto, a capacidade de reter informações de restrição de tipo ajuda a tornar F# uma linguagem atraente para programadores neste espaço que buscam um pouco mais de segurança em suas vidas.
F# 5 tem grandes fundamentos
F# 5 pode ser sobre como melhorar a interatividade e a programação analítica, mas em sua essência, F# 5 ainda é fazer com que a codificação cotidiana em F# uma alegria. F# 5 inclui vários novos recursos que os desenvolvedores de aplicativos e os autores de bibliotecas podem desfrutar.
Suporte para Nameof
Primeiro é um recurso que os desenvolvedores de C# adoraram: Nomeof . O nome do operador pega um símbolo F# como entrada e produz uma string em tempo de compilação que representa esse símbolo. Ele suporta quase todas as construções F#. O nome do operador é frequentemente usado para registrar diagnósticos em um aplicativo em execução.
#R "NUGET: FSHARP.SystemTextjson "Sistema aberto.Texto.JSON SISTEMA OPEN.Texto.JSON.Sistema aberto de serialização.Tempo de execução.Módulo CompilerServices M = Seja F x = Nomef x Printfn "%S" (M.f 12) printfn "%s" (nome de m) printfn "%s" (nome de m.f) /// versão simplificada do tipo de API do Eventstore registradoEvent = < EventType: string Data: byte[] >/// meu tipo de concreto: digite myEvent = | Adata de int | Bdata de string // use 'nameof' em vez da string literal na expressão de correspondência Let Deserialize (e: registro): myEvent = correspondência e.EventType com | Nome de Adata -> JSOnserializer.Desserialize e.Dados |> Adata | nome de bdata -> jsonserializer.Desserialize e.Dados |> bdata | T -> Failwithf "inválido EventType: %S" T
Cordas interpoladas
Em seguida, é um recurso visto em idiomas como C# e JavaScript: Strings interpolados. Strings interpolados permitem criar interpolações ou orifícios em uma string que você pode preencher com qualquer expressão F#. F# strings interpolados suportam interpolações digitadas sinônimo de o mesmo formato Especifica nos formatos Sprintf e Printf Strings. F# Strings interpolados também suportam strings triplas. Assim como em C#, todos os símbolos em uma interpolação F# são navegáveis, capazes de ser renomeados e assim por diante.
// Basic interpolated string let name = "Phillip" let age = 29 let message = $"Name: , Age: " // Typed interpolation // '%s' requires the interpolation to be a string // '%d' requires the interpolation to be an int let message2 = $"Name: %s, Age: %d" // Verbatim interpolated strings // Note the string quotes allowed inside the // interpolated string let messageJson = $""" "Name": "", "Age": """
Além disso, você pode escrever várias expressões dentro de seqüências interpoladas, produzindo um valor diferente para a expressão interpolada com base em uma entrada para a função. Este é um uso mais de nicho do recurso, mas como qualquer interpolação pode ser uma expressão F# válida, permite uma grande flexibilidade.
Declarações de tipo aberto
F# sempre permitiu que você abrisse um espaço para nome ou um módulo para expor suas construções públicas. Agora, com F# 5, você pode abrir qualquer tipo para expor construções estáticas como métodos estáticos, campos estáticos, propriedades estáticas e assim por diante. F# união e registros também podem ser abertos. Você também pode abrir um tipo genérico em um tipo específico de instanciação.
sistema de tipo aberto.Matemática Seja x = min (1.0, 2.0) Módulo M = tipo du = a | B | C Deixe algumafunção x = x + 1 // Abra apenas o tipo dentro do módulo Open Type M.Du printfn "%a" a
Expressões de computação aprimoradas
Expressões de computação são um conjunto de recursos bem amado que permite aos autores da biblioteca escrever código expressivo. Para os versados na teoria da categoria, eles também são a maneira formal de escrever cálculos monádicos e monoidais. F# 5 estende as expressões de computação com dois novos recursos:
- Formulários aplicativos para expressões de computação via Let. e! palavras-chave
- Suporte adequado para sobrecarregar operações personalizadas
“Formulários aplicativos para expressões de computação” é um pouco bocado. Vou evitar mergulhar na teoria da categoria e, em vez disso, trabalhar com um exemplo:
// Primeiro, defina um módulo de função 'zip' resultado = deixe zip x1 x2 = corresponder x1, x2 com | Ok x1res, ok x2res -> ok (x1res, x2res) | Erro E, _ -> Erro E | _, Erro E -> Erro e // Em seguida, defina um construtor com 'mescheResources' e 'bindreng' tipo resultadobuilder () = membro _.Mescamources (T1: Resultado, T2: Resultado) = Resultado.Membro do ZIP T1 T2 _.Bindreturn (x: resultado, f) = resultado.Mapa F x Let Result = ResultBuilder () Deixe Run R1 R2 R3 = // e aqui está o nosso aplicativo! Deixe res1: resultado = resultado < let! a = r1 and! b = r2 and! c = r3 return a + b - c >Match Res1 com | Ok x -> printfn " %s is: %d" (nomeof res1) x | Erro e -> printfn " %s is: %s" (nomeof res1) e
Antes de F# 5, cada um deles e! palavras -chave teriam sido deixadas! palavras-chave. O e! A palavra -chave difere na medida em que a expressão a seguir deve ser 100% independente. Não pode depender do resultado de um Let anterior! -valor ligado. Isso significa código como o seguinte não compilar:
Deixe res1: resultado = resultado < let! a = r1 and! b = r2 a // try to pass 'a' and! c = r3 b // try to pass 'b' return a + b - c >
Então, por que faríamos esse código falhar em compilar? Algumas razões. Primeiro, aplica a independência computacional em tempo de compilação. Segundo, ele compra um pouco de desempenho em tempo de execução porque permite ao compilador criar o gráfico de chamada estaticamente. Terceiro, porque cada cálculo é independente, eles podem ser executados em paralelo por qualquer ambiente em que esteja executando. Por fim, se um cálculo falhar, como no exemplo anterior em que se pode retornar um valor de erro em vez de um valor OK, a coisa toda não é curto-circuito nessa falha. Formulários Aplicativos “juntar” Todos os valores resultantes e permitem que cada cálculo seja executado antes de terminar. Se você substituísse cada um e! com um let! , qualquer que retornou um erro de curto-circuito da função. Esse comportamento diferente permite que autores e usuários da biblioteca escolham o comportamento certo com base em seu cenário.
Se isso parece que é um pouco pesado, tudo bem! Os cálculos aplicativos são um conceito avançado do ponto de vista de um autor da biblioteca, mas eles são uma ferramenta poderosa para abstração. Como usuário deles, você não precisa saber todos os meandros de como eles funcionam; Você pode simplesmente saber que cada computação em uma expressão de computação é garantida para ser executada independentemente dos outros.
Outro aprimoramento das expressões de computação é a capacidade de suportar adequadamente a sobrecarga para operações personalizadas com o mesmo nome de palavra -chave, suporte para argumentos opcionais e suporte para sistema.Argumentos de parâmetro. Uma operação personalizada é uma maneira de um autor da biblioteca especificar uma palavra -chave especial que representa seu próprio tipo de operação que pode acontecer em uma expressão de computação. Esse recurso é usado muito em estruturas como Saturno para definir um DSL expressivo para criar aplicativos da Web. Começando com F# 5, autores de componentes como Saturno podem sobrecarregar suas operações personalizadas sem advertências, como mostrado em Listagem 1.
Listagem 1: Expressões de computação podem sobrecarregar operações personalizadas
Digite inputkind = | Texto do espaço reservado: opção String | Senha do espaço reservado: String Option Type InputOptions = < Label: string option Kind: InputKind Validators: (string ->bool) Array> digite inputBuilder () = membro t.Rendimento (_) = < Label = None Kind = Text None Validators = [||] >[] Membro isto.Texto (io,?espaço reservado) = < io with Kind = Text placeholder >[] Membro isto.Senha (io,?espaço reservado) = < io with Kind = Password placeholder >[] Membro isto.Etiqueta (io, rótulo) = < io with Label = Some label >[] Membro isto.Validadores (io, [] validadores) = < io with Validators = validators >Deixe input = inputBuilder () Let Name = Entrada < label "Name" text with_validators (String.IsNullOrWhiteSpace >> não)> deixe email = entrada < label "Email" text "Your email" with_validators (String.IsNullOrWhiteSpace >> não) (diversão s -> s.Contém "@")> let senha = entrada < label "Password" password "Must contains at least 6 characters, one number and one uppercase" with_validators (String.exists Char.IsUpper) (String.exists Char.IsDigit) (fun s ->s.Comprimento> = 6)>
O suporte adequado para sobrecargas em operações personalizadas é desenvolvido inteiramente por dois colaboradores de código aberto F# Diego Esmerio e Ryan Riley.
Com formulários aplicativos para expressões de computação e a capacidade de sobrecarregar operações personalizadas, estamos animados para ver o que os autores da biblioteca F# podem fazer a seguir.
Implementações de interface em diferentes instanciações genéricas
Começando com F# 5, agora você pode implementar a mesma interface em diferentes instanciações genéricas. Esse recurso foi desenvolvido em parceria com Lukas Rieger, um colaborador de código aberto F#.
Tipo IA = Membro Resumo Get: Unit -> ?T tipo myclass () = interface IA com membro x.Get () = 1 interface IA com membro x.Get () = "hello", deixe mc = myclass () let asint = mc:> ia Let Asstring = mc:> ia asint.Get () // 1 Asstring.Get () // "Olá"
Mais .Melhorias na interopa líquida
.A rede é uma plataforma em evolução, com novos conceitos introduzidos a cada lançamento e, portanto, mais oportunidades para interoperar. Interfaces em .A NET agora pode especificar implementações padrão para métodos e propriedades. F# 5 permite consumir essas interfaces diretamente. Considere o seguinte código C#:
usando o sistema; namespace csharplibrary < public interface MyDim < public int Z =>0; >>
Esta interface pode ser consumida diretamente em F#:
Abra CSharp // Crie uma expressão de objeto para implementar a interface Deixe MD = < new MyDim >printfn $ "Dim de C#:"
Outro conceito em .NET que está recebendo mais atenção são tipos de valor anuláveis (anteriormente chamados de tipos anuláveis). Inicialmente criado para representar melhor os tipos de dados SQL, eles também são fundamentais para bibliotecas de manipulação de dados principais, como a abstração do quadro de dados na Microsoft.Dados.Análise . Para tornar um pouco mais fácil inteir com essas bibliotecas, você aplica uma nova regra direcionada para chamadas e atribuir valores a propriedades que são um tipo de valor anulado. Considere a amostra a seguir usando este pacote com uma diretiva de referência de pacote:
#R "NUGET: Microsoft.Dados.Análise "Open System Open Microsoft.Dados.Análise Deixe DateTimes = "DATETIMES" |> primitivedAtAframecolumn // o seguinte usado para não compilar Let Date = DateTime.Parse ("2019/01/01") DATETIMENTES.Anexar (data) // O anterior agora é equivalente a: Let Date = DateTime.Parse ("2019/01/01") Let Data = Nullable (Date) Datet às vezes.Anexar (dados)
Esses exemplos usados para exigir que você construa explicitamente um tipo de valor anulado com o construtor de tipo anulado como o exemplo mostra.
Melhor performance
A equipe da Microsoft passou o ano passado melhorando o desempenho do compilador F#, tanto em termos de rendimento quanto de desempenho de ferramentas em IDEs como o Visual Studio. Essas melhorias de desempenho foram lançadas gradualmente, e não como parte de uma grande versão. A soma deste trabalho que culmina em F# 5 pode fazer a diferença para a programação diária f#. Como exemplo, eu compilei a mesma base de código ? O projeto principal no FSharplus, um projeto que enfatiza notoriamente o compilador F# ? três vezes. Uma vez para F# 5, uma vez para o último F# 4.7 com .Net Core, e uma vez para o último F# 4.5 in .Núcleo líquido, como mostrado em tabela 1.
Os resultados em tabela 1 Venha da execução do DOTNET Build /CLP: Performancesunary da linha de comando e olhando para o tempo total gasto na tarefa FSC, que é o compilador F#. Os resultados podem variar no seu computador, dependendo de coisas como prioridade do processo ou trabalho em segundo plano, mas você deve ver aproximadamente as mesmas reduções nos tempos de compilação.
O desempenho do IDE é tipicamente influenciado pelo uso da memória porque o IDES, como o Visual Studio, hospeda um compilador em um serviço de idioma como um processo de longa duração. Assim como em outros processos de servidor, quanto menos a memória você usa, menos o tempo do GC é gasto limpando a memória antiga e mais tempo pode ser gasto processando informações úteis. Nós nos concentramos em duas áreas principais:
- Utilizando arquivos mapeados de memória para apoiar os metadados lidos do compilador
- Operações re-arquitetas que encontram símbolos em uma solução, como encontrar todas as referências e renomear
O resultado é significativamente menor de uso da memória para soluções maiores ao usar recursos de IDE. Figura 5 Mostra um exemplo de uso da memória ao executar as referências do tipo de string em Fake, uma base de código de código aberto muito grande, antes das alterações que fizemos.
Esta operação também leva um minuto e 11 segundos para ser concluída quando executada pela primeira vez.
Com F# 5 e as ferramentas F# atualizadas para o Visual Studio, a mesma operação leva 43 segundos para concluir e usa mais de 500 MB menos memória, conforme mostrado em Figura 6.
O exemplo com resultados mostrados em Figura 5 e Figura 6 é extremo, já que a maioria dos desenvolvedores não está procurando usos de um tipo de base como string em uma base de código muito grande, mas isso mostra o desempenho melhor quando você está usando o F# 5 e as ferramentas mais recentes para F# em comparação com apenas um ano atrás.
O desempenho é algo que é constantemente trabalhado, e as melhorias geralmente vêm de nossos colaboradores de código aberto. Alguns deles incluem Steffen Forkmann, Eugene Auduchinok, Chet Hust, Saul Rennison, Abel Braaksma, Isaac Abraham e mais. Cada lançamento apresenta um trabalho incrível de colaboradores de código aberto; Somos eternamente gratos pelo trabalho deles.
A jornada F# contínua e como se envolver
A equipe da Microsoft F# está muito animada para lançar F# 5 este ano e esperamos que você o ame tanto quanto nós. F# 5 representa o início de uma nova jornada para nós. Estou ansioso, vamos melhorar continuamente experiências interativas para fazer F# a melhor escolha para notebooks e outras ferramentas interativas. Vamos nos aprofundar no design de idiomas e continuar apoiando bibliotecas como o DiffSharp para fazer do F# uma escolha atraente para o aprendizado de máquina. E como sempre, vamos melhorar o compilador F# e os fundamentos de ferramentas e incorporar recursos de linguagem que todos podem desfrutar.
Adoraríamos ver você vir para o passeio também. F# é totalmente de código aberto, com sugestões de idiomas, design de idiomas e desenvolvimento central, tudo acontecendo no github. Existem alguns excelentes contribuidores hoje e estamos procurando mais colaboradores que desejam ter uma participação na maneira como o idioma e as ferramentas F# evoluem avançando.
Para se envolver em um nível técnico, confira os seguintes links:
- F# sugestões de idioma: https: // github.com/fsharp/fslang-sugestions
- F# Design de idioma: https: // github.com/fsharp/fslang-design
- F# Development: https: // github.com/dotnet/fsharp
- F# Running on JavaScript: https: // Fable.io/
- F# Tooling para Visual Studio Código: http: // ionide.io/
- F# Running On Web Assembly: https: // fsbolero.io/
A Fundação de Software F# também hospeda uma grande comunidade Slack, além de ser um ponto central para várias subcomunidades compartilharem informações entre si. É gratuito para participar, então vá para o site aqui para saber mais: http: // fundação.fSharp.org/junção
Quero ter uma opinião sobre onde f# vai a seguir e como é? Junte-se a nós. Adoraríamos trabalhar juntos.
Notebooks Jupyter
Os notebooks Jupyter são uma ferramenta de programação interativa que permite misturar o Markdown e codificar em um documento. O código pode ser executado no caderno, geralmente para produzir dados ou gráficos estruturados que andam de mãos dadas com uma explicação.
Jupyter Notebooks iniciados como ipython, uma ferramenta de programação interativa para programas Python. Ele cresceu para apoiar muitos idiomas diferentes e agora é uma das principais ferramentas usadas pelos cientistas de dados em seu trabalho. Também está sendo usado como uma ferramenta educacional.
Tabela 1: Compilar horários para fsharpplus.DLL em versões F# recentes
F# e .Versão Net SDK | Hora de compilar (em segundos) |
F# 5 e .NET 5 SDK | 49.23 segundos |
F# 4.7 e .Net Core 3.1 sdk | 68.2 segundos |
F# 4.5 e .Net Core 2.1 sdk | 100.7 segundos |
F# Linguagem de programação: histórico, benefícios e possibilidades futuras
Os desenvolvedores da Nescient podem cometer o erro de pronunciar o nome como f ‘Cerquilha’ Mas isso ganhará alguns olhos desprezíveis dos adeptos do desenvolvedor’s Comunidade. F Sharp (porque o # é pronunciado como nítido) é uma linguagem de programação de fonte aberta, fortemente digitada e multi-paradigma. A linguagem de programação multi-paradigma inclui a programação funcional, imperativa e orientada a objetos
Toda linguagem de programação pode se enquadrar em uma das duas categorias; fortemente digitado e fracamente digitado.
Idiomas fortemente digitados têm regulamentos altamente obstinados no momento da compilação, o que implica que erros e exceções têm maior probabilidade de ocorrer. A maioria desses regulamentos afeta valores de retorno, atribuições variáveis e chamadas de funções.
Embora a linguagem fracamente digitada seja o oposta e tenha regras de digitação frouxa que possam saudar os resultados imprevisíveis ou causar conversão de tipo implícito no tempo de execução.
Multi-paradigma refere-se ao suporte de mais de um paradigma de programação para permitir que os programadores selecionem o estilo de programação mais adequado e construções de linguagem associadas para um determinado projeto.
É frequentemente usado como uma CLI de plataforma cruzada (infraestrutura de idioma comum) e também pode gerar código JavaScript e GPU (Unidade de Processamento Graphics).
É desenvolvido pela F# Software Foundation e Microsoft, juntamente com outros colaboradores abertos.
Breve história
F# surgiu pela primeira vez em 2005, quando foi desenvolvido pela Microsoft Research. Inicialmente, era um .NET (pronunciado como rede de pontos) a implementação da OCAML, pois combinou o poder e a sintaxe da linguagem funcional com milhares de funções da biblioteca disponíveis com .Idiomas da rede.
Desde 2005, F# passou por muitas mudanças necessárias e os desenvolvedores fizeram várias versões que o tornaram melhor do que o primeiro. O lançamento do Apache License, tornou a linguagem de programação uma de origem aberta, o que significava que ela pode ser modificada, distribuída e usada sem pagar aos desenvolvedores originais.
A primeira versão lançada em 2005 foi compatível apenas com o Windows e implantou um .NET 1.0 a 3.5 tempo de execução. A base de plataforma estreita era a maior fraqueza desta versão. A questão foi abordada na próxima versão que foi desenvolvida com a adição de OS X e Linux às plataformas suportadas na versão 2.0 que foi lançado em 2010.
Em 2012, F# viu a adição de JavaScript e GPU nas plataformas suportadas. A versão mais recente foi lançada em 2015, que foi 4.0.
Futuro de f#
Muitas pessoas afirmam que F# é uma das linguagens de programação mais impopulares, subestimadas e sub-representadas. Mas há outro lado da história. De acordo com o StackOverflow. F# foi eleito o idioma associado ao salário mais bem remunerado globalmente.
A mesma pesquisa mostra que F# não’t aparece nas 25 principais linguagens de programação usadas em todo o mundo. O idioma permanece na margem, apesar de ter uma comunidade realmente ativa.
Mas por que os desenvolvedores gostam de trabalhar com F# se isso’é tão impopular? Criado e mantido por Don Syme, F# tem sido comparativamente resiliente a algumas das complicações supostas que os idiomas FP semelhantes adotaram, como Scala. Essa resistência mantém a acessibilidade para os desenvolvedores do mundo exterior que podem estar interessados em se interessar pela programação funcional.
F# tem sido de excelente utilidade quando se trata de desenvolvimento de dados e orientado por dados. Agora também pode ser compilado em JavaScript, que é o mundo’s mais populares idiomas. Com este link seguro, ele também tem acesso ao JavaScript’s extensas bibliotecas e base de dispositivos.
F# deixou sua marca quando se tratava de inteligência artificial, aprendizado de máquina e análise de dados associados. Era o próprio objetivo da criação de f#. Devido à imensa escala e influência esperada, a inteligência artificial terá nos ecossistemas e tecnologia de idiomas em geral, tendo um idioma tão bem adequado aos locais de desenvolvimento nela uma posição forte para crescer rapidamente e até desafiar idiomas populares como JavaScript e Python no futuro.
O que está parando f#’S crescimento?
Embora pareça um fato dura para digerir, a culpa por isso é atribuída principalmente a seus criadores, que é a Microsoft. Eles restringiram a popularidade de F# deixando C# florescer por aí. A Microsoft fez F# inferior a C#.
Há um movimento cíclico nele. Poucos empregos existem para F# porque existem poucos desenvolvedores de F# por aí e existem menos desenvolvedores de F# porque existem menos trabalhos F# existem por aí. Mas lenta mas seguramente, essa tendência está mudando.
Jato.com foi a primeira grande empresa a adotar o uso de f#. Mais tarde, Kaggle e muitas companhias financeiras e de seguros também se seguiram.
Os desenvolvedores de F# não têm tentativas de torná-lo mais popular e com recursos como uma linguagem multi-paradigma usada muito na IA, a melhor coisa a fazer é se concentrar nos principais benefícios do F# que são momentos mais curtos, menos bugs e maior produtividade. Se promovido ao destacar esses recursos, pode ajudar a F# subir na escada da popularidade mais rápido do que antes.
F# realmente tem alguma vantagem sobre C#?
Já familiarizado com C#? Em seguida, aprenda a programar seu próprio jogo de breakout usando C#.
- F# simplifica muitas tarefas de programação comuns. Isso implica coisas como criar e usar definições de tipo complexo, fazer processamento de lista, máquinas de estado, igualdade e comparação e muito mais.
- Desprovido de semicolons, colchetes encaracolados e outros, em F#, você quase nunca precisa especificar o tipo de objeto devido à presença de um poderoso sistema de inferência de tipo. Também é preciso menos linhas de códigos para resolver esse problema também
- F# é uma linguagem funcional, mas suporta outros estilos que não’T completamente puro, tornando muito mais fácil interagir com o domínio não-puro de bancos de dados, sites e assim por diante. Em particular, F# foi projetado como uma linguagem híbrida/oo funcional, para que seja capaz de fazer tudo como C#. Mesmo que F# se intera perfeitamente ao .Ecossistema líquido que permite acessar todos os terceiros .Ferramentas e bibliotecas de rede.
- F# faz parte do Visual Studio, que permite obter um bom editor com um apoio ao Intellisense, um depurador e muitos plugins para testes de unidade, controle de origem e outras tarefas de desenvolvimento.
F# FUTURO
Semelhante a um assíncrono < >Bloquear, mas captura o resultado para o consumo futuro. Essa estrutura pode ser muito útil para executar várias operações de retorno de resultados em paralelo quando os resultados não são necessários imediatamente. Por exemplo, executando várias operações de leitura/transformação ou pré-populando um cache com valores ainda a serem computados. Tarefa da Microsoft Biblioteca paralela em .NET 4.0 inclui uma implementação futura, então esta versão é necessária apenas no início .Versões da rede. Comentários, sugestões e melhorias são sempre bem -vindos.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74:
abrir Sistema abrir Sistema.ComponentModel abrir Sistema.Rosqueamento /// executa um cálculo em um trabalhador de fundo e sincroniza no retorno do resultado. O /// O cálculo é iniciado imediatamente e chamando os blocos de 'valor' até que o resultado esteja pronto. tipo Futuro't>(f : unidade -> 't) = /// resultado do cálculo na saída normal. deixar mutável resultado :'t opção = Nenhum /// resultado se uma exceção foi lançada. deixar mutável ext : Exceção opção = Nenhum deixar Syncroot = novo Objeto() /// objeto de pulso usado para esperar até que um resultado esteja pronto. garantirpulse () é usado para que nós /// não precisa criar o objeto se o resultado for feito antes de ser necessário. deixar mutável pulso : ManualResetevent = nulo deixar Garantapulse() = trancar Syncroot (diversão () -> corresponder pulso com | nulo -> pulso novo ManualResetevent(falso); | _ -> () pulso) /// Aviso: Ligue quando um bloqueio no Syncroot já estiver mantido. Pulsos do notificador de espera. Seguro se /// chamado depois que 'pulso' é criado, mas antes que Wagone seja chamado. deixar notificar owaiters() = se pulso <> nulo então pulso.Definir() |> ignorar deixar trabalhar = novo BackgroundWorker() /// no runworkerasync (), execute função especificada e resultado de armazenamento. Todas as exceções devem ser /// encurralado. fazer trabalhar.Dowork.Adicionar( diversão args -> tentar resultado Alguns( f()) com e -> ext Alguns e trancar Syncroot ( diversão () -> notificar owaiters())) /// Comece imediatamente/ automaticamente. fazer trabalhar.Runworkerasync() /// retorna o valor do cálculo, bloqueando se o resultado ainda não estiver pronto. membro t.Valor = // se disponível, podemos devolvê -lo imediatamente. corresponder resultado com | Alguns x -> x | Nenhum quando ext.É algum -> elevação (Opção.pegar ext) | Nenhum -> deixar p = Garantapulse() // Verifique novamente se ele mudou enquanto estávamos recebendo o objeto de espera. corresponder resultado com | Alguns x -> x | Nenhum -> // Lock-Free está ok porque se o pulso.O método set () é chamado entre quando nós // verificou 'resultado' e ligue para Wagone aqui, Wagone retornará imediatamente. p.Espera(1000000000) |> ignorar corresponder resultado com | Alguns x -> x | Nenhum -> se ext.É algum então elevação (Opção.pegar ext) outro falhar com "Futuro computação falhou." /// retorna true se o cálculo for concluído, falso se não. membro t.Está completo = corresponder resultado com | Alguns x -> verdadeiro | Nenhum quando Opção.é algum ext -> verdadeiro | Nenhum -> falso
sistema de namespace
sistema de namespace.ComponentModel
sistema de namespace.Rosqueamento
Vários itens
digite futuro =
Novo: F: (Unidade -> 'T) -> Futuro
Membro IsComplete: Bool
Valor do membro: 'T
Nome completo: script.Futuro
Executa um cálculo em um trabalhador de fundo e sincroniza no retorno do resultado. O
A computação é iniciada imediatamente e chamando os blocos de 'valor' até que o resultado esteja pronto.
val f: (unidade -> 't)
unidade de tipo = unidade
Nome completo: Microsoft.FSharp.Essencial.unidade
resultado mutável de val: 't opção
Resultado do cálculo na saída normal.
opção de digite 't = opção'T>
Nome completo: Microsoft.FSharp.Essencial.opção
Opção do caso do sindicato.Nenhum: opção
Val Mutable Ext: opção de exceção
Resultado se uma exceção foi lançada.
Vários itens
Exceção de tipo =
NOVO: Unidade -> Exceção + 2 sobrecargas
Dados dos membros: Idictionary
membro getBaseexception: unidade -> Exceção
Membro GetObjectData: Info: SerializationInfo * Contexto: StreamingContext -> Unidade
Membro GetType: Unidade -> Tipo
Helplink de membros: string with get, set
Membro Innerexception: Exceção
Mensagem do membro: string
fonte de membro: string com get, set
Membro Stacktrace: String
.
Nome completo: sistema.Exceção
--------------------
Exceção (): unidade
Exceção (mensagem: string): unidade
Exceção (Mensagem: String, Innerexception: EXN): Unidade
Val Syncroot: objeto
Vários itens
Tipo objeto =
NOVO: Unidade -> OBJ
Membro igual a: OBJ: OBJ -> BOOL
Membro GethashCode: Unit -> int
Membro GetType: Unidade -> Tipo
Membro ToString: Unit -> String
Membro estático igual a: obja: obj * objb: obj -> bool
Membro estático Referência de referência: obja: obj * objb: obj -> bool
Nome completo: sistema.Objeto
Val Mutable Pulse: Manualresetevent
Objeto de pulso usado para esperar até que um resultado esteja pronto. garantirpulse () é usado para que nós
não precisa criar o objeto se o resultado for feito antes de ser necessário.
Vários itens
Tipo manualResetevent =
herdar Eventwaithandle
NOVO: InitialState: Bool -> Manualresetevent
Nome completo: sistema.Rosqueamento.ManualResetevent
--------------------
ManualResetevent (InitialState: Bool): Unidade
Val Garantapulse: (Unidade -> ManualResetevent)
Val Lock: LockObject: 'Lock -> Ação: (Unidade ->' T) -> 'T (requer tipo de referência)
Nome completo: Microsoft.FSharp.Essencial.Operadores.trancar
Val Notifywaiters: (Unidade -> Unidade)
Aviso: ligue quando um bloqueio no syncroot já está mantido. Pulsos do notificador de espera. Seguro se
chamado depois que 'pulso' é criado, mas antes que Wagone seja chamado.
Eventwaithandle.Set (): bool
Val ignorar: Valor: 'T -> Unidade
Nome completo: Microsoft.FSharp.Essencial.Operadores.ignorar
Val Trabalho: Trabalho de fundo
Vários itens
Digite BackgroundWorker =
componente herdado
NOVO: Unidade -> BackgroundWorker
Membro Cancelamento: Unidade -> Unidade
Cancelamento de membros: BOOL
Membro Isbusy: Bool
Membro RelatórioProgress: %Progress: int -> unidade + 1 sobrecarga
Membro RunWorkerasync: Unidade -> Unidade + 1 sobrecarga
Membro WorkerReportsProgress: Bool com Get, Set
Membro WorkersupportsCancellation: bool with get, set
Evento Dowork: DoworkeventHandler
Evento ProgressChanged: ProgressChangedEventHandler
.
Nome completo: sistema.ComponentModel.BackgroundWorker
Evento BackgroundWorker.Dowork: ievent
Membro IOBServable.Adicionar: retorno de chamada 🙁 't -> unidade) -> unidade
Val Args: DoworkeventArgs
Opção do caso do sindicato.Alguns: valor: 't -> opção
vale: exn
BackgroundWorker.Runworkerasync (): unidade
BackgroundWorker.Runworkerasync (argumento: obj): unidade
Val T: Futuro
FUTURO DE MEMBROS.Valor: 'T
Nome completo: script.Futuro`1.Valor
On RunWorkerasync (), execute a função especificada e o resultado da loja. Todas as exceções devem ser
encurralado.
Comece imediatamente / automaticamente.
Retorna o valor do cálculo, bloqueando se o resultado ainda não estiver pronto.
opção de propriedade.Issome: Bool
Val Raise: Exn: Exceção -> 'T
Nome completo: Microsoft.FSharp.Essencial.Operadores.elevação
Val Get: Opção: 'T Opção ->' T
Nome completo: Microsoft.FSharp.Essencial.Opção.pegar
Val P: Manualresetevent
WaitHandle.Espera (): bool
WaitHandle.Espera (tempo limite: timespan): bool
WaitHandle.Espera (milissegundstimeout: int): bool
WaitHandle.Espera (tempo limite: timespan, exitContext: bool): bool
WaitHandle.Wagone (milissegundstimeout: int, exitContext: bool): bool
Val Failwith: Mensagem: String -> 'T
Nome completo: Microsoft.FSharp.Essencial.Operadores.falhar com
FUTURO DE MEMBROS.ISCOMPLETE: BOOL
Nome completo: script.Futuro`1.Está completo
Retorna verdadeiro se o cálculo for concluído, falso se não.
Val Issome: Opção: 'T Opção -> Bool
Nome completo: Microsoft.FSharp.Essencial.Opção.é algum
Copiar link cópia Fonte Raw View Code Test Code
Mais Informações
Link: | http: // fssnip.net/5t |
Postou: | 11 anos atrás |
Autor: | Jason McCampbell |
Tag: | assíncrono, paralelo, futuro, tópico |
Construção funcional .Aplicações líquidas: um guia para escolher entre F# vs C#
A eficiência é tudo no mundo do desenvolvimento de aplicativos. Desenvolvedores e organizações que podem fazer com que os produtos sejam comercializados mais rapidamente e forneçam atualizações mais rápidas sempre terão uma vantagem sobre a competição.
Então, todos estão sempre procurando maneiras de reduzir o tempo de desenvolvimento, o tempo gasto em depuração e teste e tempo empurrando versões acabadas para os clientes.
A programação funcional estava em uso comum décadas atrás, mas perdeu o terreno rapidamente para as linguagens de programação orientadas a objetos, que logo se tornaram o padrão de fato.
Conteúdo patrocinado relacionado
Patrocinador relacionado
Code, implante e escala Java do seu jeito.
O Microsoft Azure suporta sua carga de trabalho com opções abundantes, esteja você trabalhando em um aplicativo Java, servidor de aplicativos ou estrutura. Saber mais.
Mas nos últimos anos, houve um ressurgimento do interesse em programação funcional como uma maneira de melhorar a eficiência do desenvolvimento e criar aplicativos mais estáveis e robustos.
C# e F# são idiomas com bases de usuários crescentes que abordam a programação funcional de maneiras fundamentalmente diferentes: C# como um complemento ao seu paradigma imperativo inerente e F# como seu paradigma primário.
Este artigo investiga qual desses idiomas faz o melhor trabalho para desenvolvedores que desejam implementar a programação funcional para suas equipes e projetos.
O debate sobre programação funcional vs orientada a objetos
Para entender o debate, temos que começar um pouco mais alto com a diferença entre paradigmas de programação imperativos e declarativos.
- Programação imperativa: Uma abordagem de programação baseada em processos, onde os desenvolvedores especificam como alcançar resultados passo a passo. A programação imperativa se concentra nas mudanças estaduais e estaduais do programa. Linguagens de programação orientadas a objetos como Java e C ++ geralmente seguem o paradigma imperativo.
- Programação declarativa: Uma abordagem de programação orientada a resultados, onde os desenvolvedores especificam os tipos de resultados desejados. A programação declarativa é apátrida e a ordem de execução agnóstica. Linguagens de programação funcionais como Lisp, Python, Haskell e F# Siga o paradigma de programação declarativa.
Mas é uma simplificação excessiva tentar dividir bem todas as linguagens de programação existentes nessas categorias, pois vários idiomas oferecem aspectos de cada. São idiomas híbridos ou multi-paradigma.
Por exemplo, embora Java e C ++ tradicionalmente se enquadrem na classificação imperativa, eles também têm aspectos funcionais. O mesmo se aplica a C#. Da mesma forma, embora F# seja considerado uma linguagem funcional, ele também possui recursos imperativos.
Veja a lista dos dez principais idiomas que os desenvolvedores usam. Você verá que eles abrangem principalmente idiomas híbridos, com alguns focados em imperativos e outros mais dominante.
O JavaScript, que ocupou o primeiro lugar nesta pesquisa por uma década, é uma linguagem multi-paradigma, oferecendo recursos imperativos e orientados a objetos e recursos funcionais.
Dada a gama de adoção, é útil considerar os diferentes benefícios que cada paradigma apresenta e os vários casos de uso em que cada um se destaca.
Programação imperativa: benefícios e casos de uso
Entre os principais benefícios do paradigma imperativo está que o código escrito usando -o geralmente é facilmente compreendido e pode ser fácil de ler. Além disso, dadas as descrições meticulosas do fluxo de trabalho que a programação imperativa exige, até os desenvolvedores iniciantes acham fácil seguir.
Mas o nível de programação imperativo detalhado também vem com desvantagens. Por exemplo, em aplicações mais complexas, o código pode rapidamente se tornar inchado. À medida que o tamanho do código aumenta, a facilidade de leitura e compreensão caiu rapidamente.
Além disso, à medida que o código se expande, o potencial de erros e erros aumenta. Assim, os desenvolvedores que trabalham com idiomas imperativos geralmente se vêem gastando muito tempo depuração e teste, atrasando os lançamentos de produtos.
No entanto, a programação imperativa permanece incrivelmente popular e tem uma ampla gama de casos de uso. As aplicações tradicionais de programação imperativa incluem:
- Hipertexto e hipermídia
- Sistemas de gerenciamento de banco de dados de objetos (ODBMS)
- Sistemas Client-Server
- Sistemas em tempo real
- Inteligência artificial, aprendizado de máquina e redes neurais
- Automação
Programação funcional: benefícios e casos de uso
Os benefícios da programação funcional terminam mais no lado da eficiência da equação. Código funcional, embora menos fácil de ler e compreender à primeira vista, tende a estar mais próximo de sem insetos (i.e., sem efeitos colaterais para mudanças estaduais), reduzindo o tempo do desenvolvedor gasto em depuração e teste.
Menos insetos também se presta a aplicações mais seguras, limitando a superfície de ataque para os cibercriminosos reduzirem as chances de ataques de ransomware, malware ou injeções de SQL.
A programação funcional também é melhor no processamento paralelo e na avaliação preguiçosa. Além disso, o código funcional é mais modular e reutilizável, reduzindo a necessidade de código redundante. O conjunto de códigos menor é mais fácil de manter e pode ser de maior desempenho. No entanto, o código funcional pode ser intensivo em memória, a eliminação de qualquer velocidade se beneficia do tamanho reduzido do código e levando a um desempenho geral diminuído.
A programação funcional é particularmente popular entre os acadêmicos e cientistas de dados, porque é eficaz para lidar com a manipulação de grandes conjuntos de dados.
Dado seu foco no processamento e imutabilidade paralelos, a programação funcional é particularmente útil para:
- Ciência dos dados
- Aplicações de planilha
- Aplicações de finanças e risco
- Processamento em lote
Programação funcional: c# vs f#
C# e F# são idiomas que estão ganhando popularidade nos últimos anos. Embora ambos sejam vários paradigmas, seu foco principal difere, com C# confiando em princípios imperativos orientados a objetos e f# confiando em princípios funcionais. Mas um supera o outro quando se trata de programação funcional?
O que é C#e quem está usando?
C# é um idioma orientado a objetos multi-paradigma lançado pela Microsoft há cerca de 20 anos. Como você pode ver nas estatísticas de uso acima, foi o oitavo idioma mais popular entre os desenvolvedores em 2022, com quase um terço dos desenvolvedores usando -o. Ele também possui altas pontuações de satisfação, com dois terços dos usuários de C# dizendo que adoram usá-lo.
C# está encontrando muitos usos no desenvolvimento de serviços da web e em nuvem, bem como desenvolvimento de jogos. Empresas da Microsoft para Trustpilot e Stackoverflow estão criando aplicativos e serviços com C#.
Programação funcional em C#
Embora C# seja principalmente orientado a objetos e mutável/com estado, ele possui recursos funcionais. Aqui estão algumas maneiras de implementar o paradigma funcional em C#.
Criar imutabilidade
Como os tipos de dados em C# são inerentemente mutáveis, quando você deseja usar os princípios funcionais de programação, você precisa criar imutabilidade. E isso é mais complicado do que simplesmente confiar em tipos de dados imutáveis em f#. Especificamente, para criar tipos imutáveis em C#, você deve fazer o tipo somente leitura, remover propriedades do setter, usar um construtor para fornecer os parâmetros e, em seguida, criar uma nova instância toda vez que uma mudança de estado é necessária, em vez de mutações uma instância existente.
Use expressões Linq e Lambda
A Microsoft construiu a estrutura do LINQ (Integrated Consulta) especificamente para introduzir recursos de programação funcional em C#. O LINQ fornece funções para operar em listas ou seqüências, incluindo mapeamento (selecione), classificação (orderby) e filtragem (onde). Cada uma dessas expressões tem funções para argumentos. As expressões criam novas instâncias da sequência em vez de mutações a sequência existente. O LINQ é particularmente útil para consultar conjuntos de dados, sejam tabelas SQL, dados XML ou outras fontes.
O LINQ também permite o uso de expressões Lambda, que são essencialmente funções anônimas. As funções anônimas são um aspecto essencial da programação funcional. As expressões Lambda podem atuar como argumentos para outras funções no código, criando funções de ordem superior, outra característica comum da programação funcional.
Use cadeias de método
Um recurso comumente usado do F# é o operador de pipeline, que passa o resultado de uma função para outra função. A pipelining não está incorporada em C, mas os desenvolvedores podem imitar oleodutos em determinadas situações usando cadeias de métodos ou interfaces fluentes. Isso pode ser efetuado usando a funcionalidade StringBuilder em C#.
As cadeias de métodos também permitem que você replique outra característica comum da programação funcional, currying. Currying permite uma função com vários argumentos para receber esses argumentos em momentos diferentes. Essencialmente, na programação funcional, se uma função não receber todas as entradas necessárias, ele retorna uma nova função com as entradas que faltavam como seus argumentos.
Em C#, você implementa o curry com as cadeias de métodos para decompor um argumento multifuncional em uma sequência aninhada de várias funções de argumento único. No entanto, isso não é tão elegante ou eficiente quanto em f#.
Essas são apenas algumas das maneiras pelas quais os desenvolvedores de C# qualificados podem aplicar princípios de programação funcional em C#. E embora eles possam exigir mais esforço do que simplesmente usar F#, para os desenvolvedores que desejam todos os outros recursos que C# tem a oferecer, eles são uma alternativa viável.
O que é f#e quem está usando?
Inicialmente lançado pela Microsoft para a plataforma Windows em 2005, F# é uma linguagem de programação predominantemente funcional. Ele se expandiu para abranger plataformas Linux e MacOS em 2010 e depois JavaScript em 2013. Além disso, em 2013, a Fundação F# Software foi lançada para apoiar a Microsoft em seu desenvolvimento e a comunidade F# e a F#.
Desde a sua criação, a comunidade F# cresceu constantemente, se lentamente. Agora, inclui um grupo Github, bem como muitos projetos comunitários diferentes, de transpilers JavaScript (Fable) a gerentes de pacotes (PAKET) às bibliotecas de desenvolvimento da Web (suave) e mais.
Apesar de sua idade, F# ainda tem espaço substancial para adoção. As estatísticas de uso geral são um pouco difíceis de encontrar, mas uma pesquisa de 2021 da JetBrains de mais de 30000 desenvolvedores indicou que apenas 1% havia usado recentemente F# ou planejava fazê -lo no futuro próximo. Em comparação, 21% haviam usado recentemente C#e 4% planejava usá -lo em breve. E F# tem uma classificação de satisfação ligeiramente menor que C#, embora mais de 60% dos desenvolvedores dizem que adoram usá -lo.
Atualmente, existem menos de 100 empresas que são conhecidas por usar F# na produção, embora incluam alguns nomes conhecidos como Walmart e Huddle.
Alguns desenvolvedores estão usando F# como um complemento para C#, em vez de confiar nos recursos funcionais que existem nativamente em C#. Porque ambos compilam para .Idiomas intermediários líquidos (IL), é possível usar os dois no mesmo projeto.
Qual idioma tem vantagem para programação funcional?
Parece que esta deve ser uma pergunta muito simples de responder: F# está funcional primeiro, enquanto C# é imperativo primeiro, então a borda vai para f#. E no mais alto nível, esta afirmação é verdadeira. Mas o desenvolvimento de aplicativos, como a vida, raramente é simples o suficiente para a aplicação generalizada de verdades de alto nível.
A melhor pergunta a fazer é qual idioma é certo para você, sua equipe e os projetos em que você está trabalhando no momento. E esta é uma pergunta muito mais complexa para responder.
Escolhendo a linguagem certa para programação funcional
Ao selecionar entre C# e F# para suas necessidades de programação funcional, existem várias considerações que devem levar em consideração sua decisão:
- Quais são as necessidades do projeto? Os conjuntos de recursos específicos do seu aplicativo podem levar um longo caminho no processo de decisão. Por exemplo, se os recursos mais importantes do seu aplicativo girarem em torno dos elementos da interface do usuário, com apenas menor manipulação de dados, você pode se concentrar no C#. Mas se o seu aplicativo for intensivo em dados e os elementos da interface do usuário forem menos importantes, você provavelmente se inclinará para F#.
- Qual é o seu nível de conforto com cada idioma? Se o seu aplicativo se beneficiará da programação funcional, mas você não estiver’T experiência o suficiente com C# para lidar facilmente com as manipulações necessárias para fazer tipos imutáveis e traduzir de declarações para expressões, então você deve considerar f#.
- Como sua equipe lidará com diferentes idiomas? Ao trabalhar com uma equipe de desenvolvimento, você precisa considerar os conjuntos de habilidades e a experiência de cada membro da equipe. Você pode ter um desenvolvedor F# muito qualificado, mas outros com pouca ou nenhuma exposição a f#. Isso pode levar a dificuldades para os membros da equipe em trabalhar com código escrito por outros desenvolvedores.
- É uma abordagem de vários idiomas? A sua equipe de desenvolvimento é suficientemente qualificada para fazer com que C# e F# trabalhem juntos no mesmo projeto? Existem razões para que qualquer um desses idiomas não’t atenda suficientemente a todas as necessidades do seu aplicativo? Mas pense com cuidado antes de adotar essa abordagem - você só deve fazê -lo se for mais eficiente e mais eficaz do que usar qualquer idioma separadamente.
Conclusão
Quando um projeto de desenvolvimento exige programação funcional, existem muitas opções disponíveis para a equipe de desenvolvimento, de linguagens puramente funcionais a linguagens multi-paradigma como C# e F#. Fazer a melhor opção entre boas opções concorrentes nem sempre é simples, mas o tempo investido na tomada dessa decisão será recompensado com eficiências de desenvolvimento aprimoradas e produtos de melhor forma.