F# ha un futuro
F# 5: una nuova era di programmazione funzionale con .NETTO
Riepilogo:
1. F# 5 è la prossima versione principale della lingua F#.
2. F# 5 segna la fine dell’era attuale e l’inizio di uno nuovo.
3. F# 5 si concentra sulla programmazione interattiva, sulla programmazione orientata analitica e sulla programmazione funzionale.
4. F# Interactive (FSI) è uno strumento sviluppato per lo sviluppo iterativo e interattivo.
5. F# 5 mantiene le esperienze fondamentali di FSI, inclusi i referenze e le assunzioni di chiamate.
6. Il supporto di gestione dei pacchetti viene introdotto in FSI, consentendo un riferimento più semplice dei pacchetti NuGet.
7. F# 5 ora supporta il riferimento a qualsiasi pacchetto NuGet in uno script F#.
8. FSI ripristina e fa riferimento automaticamente a tutti i gruppi nel pacchetto.
9. F# 5 Introduce Dotnet FSI, rendendo disponibile FSI su MacOS e Linux.
10. Il supporto F# viene aggiunto nei notebook Jupyter per la programmazione interattiva.
Domande uniche:
1. Cos’è F# 5?
Risposta: F# 5 è la prossima versione principale della lingua F#.
2. Cosa segna la fine di F# 5?
Risposta: F# 5 segna la fine dell’era attuale.
3. Quali sono le tre principali aree di interesse per F# 5?
Risposta: Le tre principali aree di interesse per F# 5 sono la programmazione interattiva, la programmazione orientata all’analitica e la programmazione funzionale.
4. Cosa è F# interattivo (FSI)?
Risposta: FSI è uno strumento sviluppato per lo sviluppo iterativo e interattivo utilizzando F#.
5. Quali esperienze mantiene F# 5 da FSI?
Risposta: F# 5 mantiene le esperienze fondamentali di FSI, inclusi i referenze e le assunzioni di chiamate.
6. Cosa consente il supporto di gestione dei pacchetti in FSI?
Risposta: Il supporto di gestione dei pacchetti in FSI consente un riferimento più semplice dei pacchetti NuGet negli script F#.
7. In che modo F# 5 supporta i pacchetti NuGet di riferimento?
Risposta: F# 5 consente di fare riferimento a qualsiasi pacchetto NuGet in uno script F# e FSI ripristina automaticamente e fa riferimento a tutti gli assembly nel pacchetto.
8. Cos’è dotnet fsi?
Risposta: Dotnet FSI è un comando che rende FSI disponibile su macOS e Linux.
9. Cosa introduce il supporto aggiuntivo F# 5 per la programmazione interattiva?
Risposta: F# 5 introduce il supporto F# nei notebook Jupyter per la programmazione interattiva.
10. Come è cambiata la programmazione interattiva in F# di recente?
Risposta: La programmazione interattiva in F# si è ampliata con l’introduzione della gestione dei pacchetti, dotnet FSI e supporto F# nei notebook di Jupyter.
11. Qual è il significato di f# 1.0 e FSI?
Risposta: F# 1.0 era il rilascio iniziale del linguaggio F# e FSI (F# interattivo) è stato sviluppato insieme ad esso per lo sviluppo interattivo.
12. Su quali piattaforme è ora disponibile FSI?
Risposta: FSI è ora disponibile su MacOS e Linux, oltre a Windows.
13. In che modo F# 5 semplifica la gestione dei pacchetti?
Risposta: F# 5 semplifica la gestione dei pacchetti consentendo un facile riferimento di pacchetti NuGet e gestendo automaticamente i loro assiemi.
14. Qual è lo scopo di Dotnet FSI?
Risposta: Dotnet FSI abilita l’uso di FSI per tutte le stesse attività su MacOS e Linux su Windows.
15. In che modo F# 5 riconosce e gestisce diversi tipi di pacchetti?
Risposta: F# 5 può gestire i pacchetti con dipendenze e pacchetti nativi che richiedono un ordine di riferimento di assemblaggio specifico in FSI.
F# linguaggio di programmazione: storia, vantaggi e possibilità future
Più articoli
tipo eccezione =
Nuovo: unità -> Eccezione + 2 sovraccarico
Dati del membro: Idictionary
membro getbasexception: unità -> eccezione
membro getObjectData: Info: SerializationInfo * Contesto: StreamingContext -> Unità
membro getttype: unità -> tipo
Helplink membro: stringa con get, set
Membro InnerException: eccezione
Messaggio del membro: stringa
Fonte membro: stringa con get, set
Membro Stacktrace: String
.
F# 5: una nuova era di programmazione funzionale con .NETTO
Nel team F# di Microsoft, miglioriamo costantemente la lingua F# per consentire agli sviluppatori di fare una programmazione funzionale .NETTO. Nelle precedenti quattro versioni, dal 2017 ad ora, siamo stati in un lungo viaggio per rendere F# FANTASTICO .Core netto. Abbiamo rinnovato il compilatore F# e la libreria principale per eseguire il supporto multipiattaforma, aggiunto supporto per la programmazione a piattaforma multipla e di basso livello e aggiunto la possibilità di visualizzare in anteprima le caratteristiche del linguaggio che possono spedire .Rilasci di anteprima netta.
Con il .Release net 5, stiamo rilasciando F# 5, la prossima versione principale della lingua F#. Ma F# 5 non è solo un fascio di funzionalità che arriva per la corsa .Net 5. F# 5 segna la fine dell’era attuale ? Prestare supporto per .Core netto ? e l’inizio di uno nuovo. Con F# 5, stiamo prendendo in considerazione il nostro viaggio per portare F# a .Core netto per lo più completo. Con F# 5, la nostra attenzione si sposta da .Core netto a tre aree principali:
- Programmazione interattiva
- Rendere la programmazione orientata analitica conveniente e divertente
- Grandi fondamenti e prestazioni per la programmazione funzionale .NETTO
In questo articolo, esaminerò le funzionalità di linguaggio e strumenti F# che abbiamo implementato per F# 5 e spiegherò come si allineano con i nostri obiettivi.
F# 5 rende la programmazione interattiva una gioia
F# ha una lunga storia di interattivo. In effetti, quando f# 1.0 è stato sviluppato, è stato sviluppato uno strumento chiamato F# Interactive (FSI) per l’eventuale rilascio di F# 1.0 nel 2006. Ciò ha coinciso con la prima integrazione degli strumenti in Visual Studio. FSI è stato usato abbastanza pesantemente nella commercializzazione iniziale di F# (come mostrato in Figura 1) per dimostrare lo sviluppo iterativo e interattivo di applicazioni di Windows Forms, scene grafiche e giochi su Windows.
Le esperienze fondamentali di FSI sono rimaste in gran parte le stesse in F# 5. Questi includono:
- La possibilità di fare riferimento e chiamare in assemblaggi sul tuo computer
- La possibilità di caricare altri script F# da eseguire come raccolta di script
- Integrazione con Visual Studio
- La possibilità di personalizzare l’output
Tuttavia, come f# e il .Ecosistema netto spostato da assembly su un computer ai pacchetti installati tramite un gestore di pacchetti, molti sviluppatori F# che utilizzano FSI per varie attività si sono trovate seccate dal dover scaricare manualmente un pacchetto e fare riferimento manualmente ai suoi assemblaggi. Inoltre, come .Net’s Reach esteso oltre Windows, gli sviluppatori su MacOS o Linux si sono trovati mancanti e si basano su un’installazione mono per utilizzare FSI nei loro ambienti.
Introduzione del supporto di gestione dei pacchetti in FSI
L’uso di un pacchetto in uno script F# è stata a lungo una fonte di frustrazione per i programmatori F#. In genere hanno scaricato pacchetti da soli e hanno fatto riferimento a assemblaggi nel percorso del pacchetto manualmente. Un set più piccolo di programmatori F# ha usato il Paket Gestione pacchetti e generato a “Carica script” ? Una funzione in Paket che genera un file di script F# con riferimenti a tutti gli assembly nei pacchetti che si desidera fare riferimento ? e carica questa sceneggiatura nei loro script F# funzionanti. Tuttavia, poiché Paket è un’alternativa a Nuget anziché a uno strumento predefinito, la maggior parte dei programmatori F# non lo usa.
Ora con F# 5, puoi semplicemente fare riferimento a qualsiasi pacchetto NuGet in uno script F#. FSI ripristina questo pacchetto con NuGet e fa riferimento automaticamente a tutti gli assembly nel pacchetto. Ecco un esempio:
#R "NuGet: Newtsoft.JSON "Open Newtsoft.Json let o = <| X = 2; Y = "Hello" |>printfn "%s" (jsonconvert.Serializeobject o)
Quando esegui il codice in quello snippet, vedrai il seguente output:
Val o: <| X: int; Y: string |>= < X = 2 Y = "Hello" >Val it: unità = ()
La funzione di gestione dei pacchetti può gestire quasi tutto ciò che vuoi lanciarlo. Supporta pacchetti con dipendenze native come ML.Netto o lancio. Supporta inoltre pacchetti come FParsec, che in precedenza richiedeva che ciascun gruppo nel pacchetto fosse referenziato in un ordine specifico in FSI.
Presentazione di Dotnet FSI
La seconda grande frustrazione per i programmatori F# usando FSI è che mancava .Core netto per molto tempo. Microsoft ha rilasciato una versione iniziale di FSI per .Core netto con .Core netto 3.0, ma era utile solo per gli script F# che non incorporavano alcuna dipendenza. Ora, insieme alla gestione dei pacchetti, è possibile utilizzare FSI per tutte le stesse attività su MacOS o Linux come faresti su Windows (ad eccezione del lancio di WINFFORMS e WPF, per ovvie ragioni). Questo viene fatto con un singolo comando: Dotnet FSI .
Presentazione del supporto F# nei notebook Jupyter
Non c’è dubbio che la gestione dei pacchetti e la resa disponibili FSI ovunque renda F# migliore per la programmazione interattiva. Ma Microsoft sentiva che potevamo fare di più di questo. La programmazione interattiva è esplosa negli ultimi anni nella comunità di Python, grazie in gran parte ai quaderni di Jupyter. La comunità F# aveva creato il supporto iniziale per F# in Jupyter molti anni fa, quindi abbiamo lavorato con il suo attuale manutentore per conoscere cosa significava e costruita una buona esperienza per Jupyter.
Ora, con F# 5, puoi attirare pacchetti, ispezionare i dati e tracciare i risultati della tua sperimentazione in un notebook condivisibile a piattaforma multipla che chiunque può leggere e regolare, come mostrato in figura 2.
Un altro motivo per cui siamo molto entusiasti del supporto F# nei notebook di Jupyter è che i notebook sono facili da condividere con altre persone. I notebook di Juputer rendono i documenti di markdown in GitHub e altri ambienti. Non solo sono uno strumento di programmazione, ma producono un documento che può essere utilizzato per istruire gli altri come eseguire compiti, condividere i risultati, imparare una biblioteca o addirittura imparare F# stesso!
Presentazione del supporto F# nei notebook del codice Visual Studio
F# Support in Jupyter Notebooks porta l’interattività a un livello completamente nuovo. Ma Jupyter non è l’unico modo per programmare un taccuino. Visual Studio Code sta inoltre portando la programmazione di notebook nell’ovile, con tutta la potenza di un servizio di lingua che ti aspetteresti di trovare durante la modifica del codice in un file normale. Con il supporto F# nei quaderni di codice Visual Studio, puoi goderti l’integrazione del servizio linguistico durante la costruzione di un notebook, come mostrato in Figura 3.
Un altro vantaggio dei quaderni di codice Visual Studio è il suo formato di file, progettato per essere leggibile dall’uomo e facile da differire nel controllo della sorgente. Supporta l’importazione di notebook jupyter ed esportazione dei notebook del codice Visual Studio come Notebook Jupyter, come puoi vedere in Figura 4.
Puoi fare molte cose con F# in Visual Studio Code e Notebook Jupyter e stiamo cercando di espandere le capacità oltre a ciò che è stato descritto finora. La nostra tabella di marcia include l’integrazione con vari altri strumenti, la visualizzazione dei dati più coesi e i dati si interrogano con Python.
F# 5 pone più basi per la programmazione analitica
Un paradigma di crescente importanza nell’era dell’apprendimento automatico e della scienza dei dati è quello che mi piace chiamare “Programmazione analitica.” Questo paradigma non è esattamente nuovo, anche se ci sono nuove tecniche, biblioteche e framework che escono ogni giorno per far avanzare ulteriormente lo spazio. La programmazione analitica riguarda l’analisi e la manipolazione dei dati, di solito applicando tecniche numeriche per fornire approfondimenti. Ciò va dall’importazione di un CSV e dal calcolo di una regressione lineare sui dati alle reti neurali più avanzate e ad alta intensità di calcolo che escono dagli istituti di ricerca AI.
F# 5 rappresenta l’inizio della nostra incursione in questo spazio. Il team di Microsoft pensa che F# sia già ottimo per manipolare i dati, come hanno dimostrato innumerevoli utenti F# utilizzando F# esattamente per questo scopo. F# ha anche un grande supporto per la programmazione numerica con alcuni tipi e funzioni integrati e una sintassi accessibile e succinto. Quindi l’abbiamo tenuto a mente e identificato alcune più aree per migliorare.
Comportamento coerente con le fette
Un’operazione molto comune eseguita nella programmazione analitica sta prendendo una fetta di una struttura di dati, in particolare gli array. F# fette usate per comportarsi in modo incoerente, con un comportamento out-of-bounds che si traduce in un’eccezione di runtime e altri che si traducono in una fetta vuota. Abbiamo modificato tutte le fette per i tipi di f# intrinseci – array, elenchi, stringhe, array 3D e array 4D – per restituire una fetta vuota per qualsiasi fetta che potresti specificare che non potrebbe esistere:
Sia l = [1..10] Let a = [| 1..10 |] lascia s = "ciao!"// prima: elenco vuoto // f# 5: stesso Let EmptyList = l.[-2..(-1)] // prima: lancerebbe un'eccezione // f# 5: array vuoto let Emploray = a.[-2..(-1)] // Prima: lancerebbe un'eccezione // f# 5: stringa vuota letString = S.[-2..(-1)]
Il ragionamento per questo è in gran parte perché in F#, le fette vuote compongono con fette non vuote. Una stringa vuota può essere aggiunta a una stringa non vuota, gli array vuoti possono essere aggiunti a array non vuoti, ecc. Questo cambiamento non è in grado e consente la prevedibilità nel comportamento.
Taglietta dell’indice fisso per array 3D e 4D
F# ha un supporto integrato per array 3D e 4D. Questi tipi di array hanno sempre supportato affettare e indicizzare, ma non tagliare mai in base a un indice fisso. Con F# 5, questo è ora possibile:
// Innanzitutto, crea un array 3D con valori da 0 a 7 let Dim = 2 let m = array3d.zerocreate dim dmin dim lascia mutabile cnt = 0 per z in 0..Dim-1 do per y in 0..Dim-1 do per x in 0..Dim-1 do m.[x, y, z]
Questo aiuta a completare l'immagine per gli scenari di taglio con array 3D e 4D.
Anteprima: indici inversi
Microsoft sta inoltre introducendo la possibilità di utilizzare indici inversi, che possono essere utilizzati con le fette, come anteprima in F# 5. Per usarlo, basta posizionare
lascia xs = [1..10] // Ottieni l'elemento 1 dalla fine: xs.[^1] // Old Way per ottenere gli ultimi due elementi lasciate lastTwooldStyle = XS.[(XS.Lunghezza-2)..] // Nuovo modo per ottenere gli ultimi due elementi lasciate lastTWoneWStyle = XS.[^1..] LastTwooldStyle = lastTwoneWstyle // true
Puoi anche definire i propri membri tramite un'estensione del tipo F# per aumentare questi tipi per supportare F# Taging e Indexi inverse. L'esempio seguente lo fa con il tipo di span:
Tipo di sistema aperto con SP del membro.Getlice (startidx, endidx) = let s = defaultArg startidx 0 let e = defaultArg endidx sp.Lunghezza sp.Slice (s, e - s) membro SP.GetReverseIndex (_, offset: int) = sp.Lunghezza - offset let sp = [| 1; 2; 3; 4; 5 |].Asspan () sp.[..^2] // [| 1; 2; 3 |]
F# tipi intrinseci hanno indici inversi incorporati. In una versione futura di F#, supporteremo anche il intero completo con il sistema.Indice e sistema.Intervallo, a quel punto, la funzione non sarà più in anteprima.
Citazioni di codice migliorate
Le citazioni di codice F# sono una funzione di metaprogrammazione che consente di manipolare la struttura del codice F# e valutarla in un ambiente di scelta. Questa capacità è essenziale per l'utilizzo di F# come linguaggio di costruzione del modello per attività di apprendimento automatico, in cui il modello AI può funzionare su hardware diverso, come una GPU. Un pezzo critico mancante in questo puzzle è stato la capacità di rappresentare fedelmente informazioni di vincolo del tipo F#, come quelle utilizzate nell'aritmetica generica, nella citazione F# in modo che un valutatore possa sapere di applicare tali vincoli nell'ambiente in cui sta valutando.
A partire da F# 5, i vincoli sono ora mantenuti nelle citazioni del codice, sblocco della capacità di alcune librerie come DiffSharp di utilizzare questa parte del sistema F# Type a suo vantaggio. Un modo semplice per dimostrare questo è il seguente codice:
Open Fsharp.Linq.RuntimeHelpers let Eval Q = LeafExpressionConverter .Valutatequotation Q Sia in linea negate x = -x // in modo fondamentale, 'negare' ha // la seguente firma: // // Val inline negare: // x: ^a -> ^a // quando ^A: // (membro statico (~ -): ^a -> ^a) // // Questo vincolo è fondamentale per la sicurezza del tipo F# . |> Val
L'uso di un operatore aritmetico implica un vincolo di tipo tale che tutti i tipi passano per negare devono supportare il ? operatore. Questo codice fallisce in fase di esecuzione perché la citazione del codice non mantiene queste informazioni di vincolo, quindi valutarlo genera un'eccezione.
Le citazioni del codice sono le basi per qualche altro lavoro pesante di R&S che viene svolto per utilizzare F# come linguaggio per la creazione di modelli di intelligenza artificiale, e quindi la capacità di trattenere le informazioni sui vincoli di tipo aiuta a rendere F# un linguaggio avvincente per i programmatori in questo spazio che cercano un po 'più di sicurezza del tipo nelle loro vite.
F# 5 ha grandi fondamenti
F# 5 potrebbe essere quello di migliorare l'interattività e la programmazione analitica, ma al centro, F# 5 consiste ancora nel rendere la codifica quotidiana in F# una gioia. F# 5 include diverse nuove funzionalità che possono godere sia gli sviluppatori di app che gli autori della biblioteca.
Supporto per il nome
Il primo è una caratteristica che gli sviluppatori C# hanno imparato a Love: Nameof . Il nome dell'operatore prende un simbolo F# come input e produce una stringa al tempo di compilazione che rappresenta quel simbolo. Supporta quasi tutti i costrutti F#. L'operatore di nome viene spesso utilizzato per la registrazione della diagnostica in un'applicazione in esecuzione.
#r "NuGet: fsharp.SystemTextJson "Sistema aperto.Testo.JSON Open System.Testo.JSON.Sistema aperto di serializzazione.Runtime.Modulo compilerservices m = let f x = nameof x printfn "%s" (m.f 12) printfn "%s" (nameof m) printfn "%s" (nameof m.f) /// versione semplificata del tipo API di EventStore RecorddeEvent = < EventType: string Data: byte[] >/// il mio tipo di cemento: digita myevent = | Adata di int | Bdata della stringa // usa 'nameof' invece della stringa letterale nell'espressione di corrispondenza lascia deserialis (e: registratovent): myevent = match e.EventType con | Nameof Adata -> JSonserializer.Deserializza e.Dati |> Adata | Nameof Bdata -> JSonserializer.Deserializza e.Dati |> bdata | t -> failwithf "non valido eventtype: %s" t
Stringhe interpolate
Il prossimo è una funzione vista in linguaggi come C# e JavaScript: stringhe interpolate. Le stringhe interpolate consentono di creare interpolazioni o fori in una stringa che puoi compilare con qualsiasi espressione F#. F# Supporto stringhe interpolate Interpolazioni digitate Sinonimo dello stesso formato Specifica nei formati di stringhe Sprintf e Printf. F# stringhe interpolate supportano anche stringhe a triplo ciuffi. Proprio come in C#, tutti i simboli in un'interpolazione F# sono navigabili, in grado di essere rinominati e così via.
// stringa interpolata di base let name = "phillip" let age = 29 let message = $ "nome :, età:" // interpolazione digitata // ' %s' richiede che l'interpolazione sia una stringa // ' %d' richiede l'interpolazione per essere un messaggio INT LET2 = $ "Nome: %s, age: %d" // VerbatIt Strings// Nota le quote di stringa Instringence WETPOLED interpolate Interpolated interpolate. "" "" Nome ":" "," Age ":" ""
Inoltre, è possibile scrivere più espressioni all'interno di stringhe interpolate, producendo un valore diverso per l'espressione interpolata in base a un input alla funzione. Questo è un uso più di nicchia della funzione, ma poiché qualsiasi interpolazione può essere un'espressione F# valida, consente una grande flessibilità.
Dichiarazioni di tipo aperto
F# ti ha sempre permesso di aprire uno spazio dei nomi o un modulo per esporre i suoi costrutti pubblici. Ora, con F# 5, puoi aprire qualsiasi tipo per esporre costrutti statici come metodi statici, campi statici, proprietà statiche e così via. F# Union e Records possono anche essere aperti. Puoi anche aprire un tipo generico a un tipo specifico.
Sistema di tipo aperto.Matematica let x = min (1.0, 2.0) Modulo M = type du = a | B | C Let SomeOtherfunction x = x + 1 // Apri solo il tipo all'interno del modulo aperto tipo M.Du printfn "%a" a
Espressioni di calcolo migliorate
Le espressioni di calcolo sono un insieme molto amato di funzionalità che consentono agli autori della libreria di scrivere codice espressivo. Per quelli esperti nella teoria della categoria, sono anche il modo formale di scrivere calcoli monadici e monoidali. F# 5 estende le espressioni di calcolo con due nuove funzionalità:
- Forme applicative per espressioni di calcolo tramite let. E! Parole chiave
- Supporto adeguato per il sovraccarico di operazioni personalizzate
“Forme applicative per espressioni di calcolo” è un po 'un boccone. Eviterò immergermi nella teoria della categoria e invece lavorerò attraverso un esempio:
// Innanzitutto, definisci un risultato del modulo "zip" = let zip x1 x2 = match x1, x2 con | OK X1RES, OK X2RES -> OK (X1RES, X2RES) | Errore E, _ -> Errore E | _, Errore E -> Errore e // Next, Definisci un costruttore con "Mergesources" e "BindReturn" Type ResultBuilder () = membro _.Mergesources (T1: risultato, T2: risultato) = risultato.membro zip t1 t2 _.BindReturn (x: risultato, f) = risultato.mappa f x let result = resultBuilder () Let RUN R1 R2 R3 = // e ecco il nostro applicativo! Let Res1: risultato = risultato < let! a = r1 and! b = r2 and! c = r3 return a + b - c >Match Res1 con | OK x -> printfn " %s is: %d" (nameof res1) x | Errore E -> printfn " %s è: %s" (nameof res1) e
Prima di F# 5, ciascuno di questi e! Le parole chiave sarebbero state lasciate! Parole chiave. Il e! La parola chiave differisce in quanto l'espressione che ne segue deve essere indipendente al 100%. Non può dipendere dal risultato di un precedente let! -valore vincolato. Ciò significa che il codice come i seguenti non riesce a compilare:
Let Res1: risultato = risultato < let! a = r1 and! b = r2 a // try to pass 'a' and! c = r3 b // try to pass 'b' return a + b - c >
Quindi, perché dovremmo fare in modo che quel codice non abbia compilato? Alcuni motivi. Innanzitutto, applica l'indipendenza computazionale al momento della compilazione. In secondo luogo, acquista un po 'di prestazioni in fase di esecuzione perché consente al compilatore di creare staticamente il grafico delle chiamate. Terzo, poiché ogni calcolo è indipendente, può essere eseguito in parallelo da qualunque ambiente stia eseguendo. Infine, se un calcolo fallisce, ad esempio nell'esempio precedente in cui si può restituire un valore di errore anziché un valore OK, il tutto non si cortocircziò su tale errore. Forme applicative “raccogliere” Tutti i valori risultanti e consentire l'esecuzione di ciascun calcolo prima di finire. Se dovessi sostituire ciascuno e! con un let! , quello che ha restituito un errore di errore fuori dalla funzione. Questo comportamento diverso consente agli autori e agli utenti della biblioteca di scegliere il comportamento giusto in base al proprio scenario.
Se sembra che sia un po 'pesante, va bene! I calcoli applicativi sono un po 'un concetto avanzato dal punto di vista di un autore di biblioteca, ma sono uno strumento potente per l'astrazione. Come utente di loro, non è necessario conoscere tutti i dettagli di come funzionano; Puoi semplicemente sapere che ogni calcolo in un'espressione di calcolo è garantito per essere eseguito indipendentemente dagli altri.
Un altro miglioramento delle espressioni di calcolo è la capacità di supportare correttamente il sovraccarico per operazioni personalizzate con lo stesso nome della parola chiave, supporto per argomenti opzionali e supporto per il sistema.Argomenti di Paramarray. Un'operazione personalizzata è un modo per un autore della libreria di specificare una parola chiave speciale che rappresenti il proprio tipo di operazione che può avvenire in un'espressione di calcolo. Questa funzione viene utilizzata molto in framework come Saturno per definire un DSL espressivo per la costruzione di app Web. A partire da F# 5, gli autori di componenti come Saturno possono sovraccaricare le loro operazioni personalizzate senza avvertimenti, come mostrato in Elenco 1.
Elenco 1: Le espressioni di calcolo possono sovraccaricare operazioni personalizzate
tipo inputKind = | Testo del segnaposto: String Option | Password del segnaposto: tipo di opzione String InputOptions = < Label: string option Kind: InputKind Validators: (string ->bool) array> tipo inputBuilder () = membro t.Rendimento (_) = < Label = None Kind = Text None Validators = [||] >[] membro questo.Testo (io,?segnaposto) = < io with Kind = Text placeholder >[] membro questo.Password (io,?segnaposto) = < io with Kind = Password placeholder >[] membro questo.Etichetta (io, etichetta) = < io with Label = Some label >[] membro questo.Validatori (io, [] validatori) = < io with Validators = validators >let input = inputBuilder () let name = input < label "Name" text with_validators (String.IsNullOrWhiteSpace >> NOT)> Let Email = Input < label "Email" text "Your email" with_validators (String.IsNullOrWhiteSpace >> NOT) (Fun S -> S.Contiene "@")> let password = input < 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.Lunghezza> = 6)>
Il supporto adeguato per i sovraccarichi nelle operazioni personalizzate è sviluppato interamente da due collaboratori open source F# Diego Esmerio e Ryan Riley.
Con forme applicative per le espressioni di calcolo e la possibilità di sovraccaricare operazioni personalizzate, siamo entusiasti di vedere cosa possono fare gli autori della libreria F#.
Implementazioni di interfaccia a diverse istanziazioni generiche
A partire da F# 5, ora puoi implementare la stessa interfaccia a diverse istanziazioni generiche. Questa funzione è stata sviluppata in collaborazione con Lukas Rieger, un collaboratore open source F#.
tipo ia = membro astratto Get: unità -> ?T tipo myclass () = interfaccia ia con membro x.Get () = 1 interfaccia ia con membro x.Get () = "hello" let mc = myclass () let asint = mc:> ia let asstring = mc:> ia asint.Get () // 1 asstring.Get () // "ciao"
Di più .Miglioramenti interrogati netti
.La rete è una piattaforma in evoluzione, con nuovi concetti introdotti ogni uscita e quindi più opportunità di interagire. Interfacce in .Net può ora specificare le implementazioni predefinite per metodi e proprietà. F# 5 ti consente di consumare queste interfacce direttamente. Considera il seguente codice C#:
usando il sistema; spazio dei nomi csharplibrary < public interface MyDim < public int Z =>0; >>
Questa interfaccia può essere consumata direttamente in F#:
Apri csharp // crea un'espressione dell'oggetto per implementare l'interfaccia let md = < new MyDim >printfn $ "Dim da c#:"
Un altro concetto in .Net che sta ricevendo un po 'più di attenzione è un valore di valore nullabile (precedentemente chiamati tipi Nullable). Inizialmente creati per rappresentare meglio i tipi di dati SQL, sono anche fondamentali per le librerie di manipolazione dei dati core come l'astrazione del frame di dati in Microsoft.Dati.Analisi . Per rendere un po 'più facile incollare con queste librerie, si applica una nuova regola diretta dal tipo per chiamare i metodi e assegnare valori a proprietà che sono un tipo di valore nullabile. Considera il seguente campione utilizzando questo pacchetto con una direttiva di riferimento del pacchetto:
#R "NuGet: Microsoft.Dati.Analisi "Apri Sistema Apri Microsoft.Dati.Analisi let DateTimes = "DateTimes" |> primititataTaFrameColumn // quanto i seguenti non riescono a compilare let Date = DateTime.Parse ("2019/01/01") DateTimes.Append (data) // Il precedente è ora equivalente a: let date = DateTime.Parse ("2019/01/01") let data = nulllable (data) dateTimes.Append (dati)
Questi esempi usati per richiedere esplicitamente costruisci un tipo di valore Nulllable con il costruttore di tipo Nullable come mostra l'esempio.
Prestazioni migliori
Il team Microsoft ha trascorso l'anno scorso migliorando le prestazioni del compilatore F# sia in termini di throughput che di prestazioni degli strumenti in IDE come Visual Studio. Questi miglioramenti delle prestazioni sono stati implementati gradualmente piuttosto che come parte di una grande versione. La somma di questo lavoro che culmina in F# 5 può fare la differenza per la programmazione F# di tutti i giorni. Ad esempio, ho compilato la stessa base di codice ? Il progetto principale di Fsharplus, un progetto che sottolinea notoriamente il compilatore F# ? tre volte. Una volta per F# 5, una volta per l'ultimo F# 4.7 con .Net Core e una volta per l'ultimo F# 4.5 in .Core netto, come mostrato in Tabella 1.
I risultati Tabella 1 provengono dall'esecuzione di dotnet build /clp: performancesunnary dalla riga di comando e guardando il tempo totale trascorso nell'attività FSC, che è il compilatore F#. I risultati potrebbero variare sul tuo computer a seconda di cose come la priorità del processo o il lavoro di fondo, ma dovresti vedere all'incirca le stesse diminuzioni nei tempi di compilazione.
Le prestazioni IDE sono in genere influenzate dall'uso della memoria perché gli IDE, come Visual Studio, ospitano un compilatore all'interno di un servizio linguistico come processo di lunga durata. Come con altri processi del server, meno memoria si utilizza, meno tempo GC è dedicato a ripulire la vecchia memoria e più tempo può essere dedicato a elaborare informazioni utili. Ci siamo concentrati su due aree principali:
- Utilizzando file mappati dalla memoria per back metadati letto dal compilatore
- Le operazioni di re-architection che trovano simboli su una soluzione, come trovare tutti i riferimenti e rinominare
Il risultato è significativamente inferiore all'utilizzo della memoria per soluzioni più grandi quando si utilizzano funzionalità IDE. Figura 5 mostra un esempio di utilizzo della memoria durante l'esecuzione di Trova riferimenti sul tipo di stringa in falso, una base di codice open source molto grande, prima delle modifiche che abbiamo apportato.
Questa operazione richiede anche un minuto e 11 secondi per essere completato quando viene eseguita per la prima volta.
Con F# 5 e gli strumenti F# aggiornati per Visual Studio, la stessa operazione richiede 43 secondi per completare e utilizza una memoria di oltre 500 MB in meno, come mostrato in Figura 6.
L'esempio con i risultati mostrati in Figura 5 E Figura 6 è estremo, dal momento che la maggior parte degli sviluppatori non è alla ricerca di usi di un tipo di base come la stringa in una base di codice molto grande, ma dimostra quanto sono le prestazioni migliori quando si utilizza F# 5 e gli ultimi strumenti per F# rispetto a solo un anno fa.
Le prestazioni sono qualcosa su cui è costantemente lavorato e i miglioramenti spesso provengono dai nostri collaboratori open source. Alcuni di loro includono Steffen Forkmann, Eugene Auduchinok, Chet Hust, Saul Rennison, Abel Braaksma, Isaac Abraham e altri. Ogni rilascio presenta un lavoro straordinario dei collaboratori open source; Siamo eternamente grati per il loro lavoro.
Il viaggio F# continua e come essere coinvolti
Il team Microsoft F# è molto entusiasta di rilasciare F# 5 quest'anno e speriamo che lo amerai tanto quanto noi. F# 5 rappresenta l'inizio di un nuovo viaggio per noi. Guardando avanti, miglioreremo continuamente le esperienze interattive per rendere F# la scelta migliore per i notebook e altri strumenti interattivi. Andremo più a fondo nella progettazione del linguaggio e continueremo a supportare librerie come DiffSharp per rendere F# una scelta avvincente per l'apprendimento automatico. E come sempre, miglioreremo i fondamenti del compilatore F# e degli strumenti e incorporare caratteristiche linguistiche che tutti possono godere.
Ci piacerebbe vederti venire anche per la corsa. F# è completamente open source, con suggerimenti linguistici, progettazione linguistica e sviluppo di base che si verificano su GitHub. Ci sono alcuni eccellenti collaboratori oggi e stiamo cercando più collaboratori che vogliono avere un interesse su come si evolvono il linguaggio e gli strumenti F#.
Per essere coinvolto a livello tecnico, controlla i seguenti collegamenti:
- F# Suggerimenti linguistici: https: // github.com/fsharp/fsgesgestions
- F# Language Design: https: // github.com/fsharp/fslang-design
- F# Sviluppo: https: // github.com/dotnet/fsharp
- F# in esecuzione su JavaScript: https: // Fable.io/
- F# strumenti per il codice Visual Studio: http: // ionide.io/
- F# in esecuzione sul gruppo web: https: // fsboloro.io/
La Fondazione software F# ospita anche una grande comunità di Slack, oltre ad essere un punto centrale per varie commissioni secondarie per condividere le informazioni tra loro. È gratuito ad unirsi, quindi vai al sito Web qui per saperne di più: http: // Foundation.fsharp.org/join
Voglio dire in cui F# va dopo e come lo fa? Vieni, unisciti a noi. Ci piacerebbe lavorare insieme.
Notebook Jupyter
I notebook Jupyter sono uno strumento di programmazione interattivo che consente di mescolare il markdown e il codice in un documento. Il codice può essere eseguito nel notebook, spesso per produrre dati strutturati o grafici che vanno di pari passo con una spiegazione.
I notebook di Jupyter hanno iniziato come Ipython, uno strumento di programmazione interattivo per i programmi Python. È cresciuto per supportare molte lingue diverse ed è ora uno degli strumenti principali utilizzati dai dati scienziati nel loro lavoro. Viene anche usato come strumento educativo.
Tabella 1: tempi di compilazione per fsharpplus.DLL tra le recenti versioni F#
F# e .Versione SDK netta | È ora di compilare (in secondi) |
F# 5 e .Net 5 SDK | 49.23 secondi |
F# 4.7 e .Core netto 3.1 SDK | 68.2 secondi |
F# 4.5 e .Core netto 2.1 SDK | 100.7 secondi |
F# linguaggio di programmazione: storia, vantaggi e possibilità future
Gli sviluppatori nescient potrebbero commettere l'errore di pronunciare il nome come F ‘Hash’ Ma ciò guadagnerà alcuni occhi sprezzanti da quelli abili nello sviluppatore’comunità s. F Sharp (perché il # è pronunciato come acuto) è un linguaggio di programmazione multi-paradigma open source, fortemente digitato. Il linguaggio di programmazione multi-paradigma è comprensivo di programmazione funzionale, imperativa e orientata agli oggetti
Ogni linguaggio di programmazione può rientrare in una delle due categorie; fortemente digitato e debolmente digitato.
Le lingue fortemente tipizzate hanno regolamenti altamente ostinati al momento della compilazione, il che implica che sono più probabili errori ed eccezioni. La maggior parte di questi regolamenti influisce sui valori di restituzione, le assegnazioni variabili e le chiamate delle funzioni.
Mentre il linguaggio debolmente digitato è l'opposto e ha regole di battitura sciolte che possono salutare risultati imprevedibili o causare conversione di tipo implicita in fase di esecuzione.
Il multi-paradigma si riferisce al supporto di più di un paradigma di programmazione per consentire ai programmatori di selezionare lo stile di programmazione più adatto e i costrutti del linguaggio associato per un determinato progetto.
Viene spesso usato come CLI multipiattaforma (infrastruttura del linguaggio comune) e può anche generare codice JavaScript e GPU (Graphics Processing Unit).
È sviluppato da F# Software Foundation e Microsoft insieme ad altri collaboratori aperti.
Breve storia
F# è nato per la prima volta nel 2005 quando è stato sviluppato da Microsoft Research. Inizialmente, era un .Net (pronunciato come dot net) Implementazione di OCAML poiché ha combinato la potenza e la sintassi del linguaggio funzionale con migliaia di funzioni di libreria disponibili con .Lingue nette.
Dal 2005, F# ha subito molte modifiche necessarie e gli sviluppatori hanno reso varie versioni che lo hanno reso migliore del primo. Il lancio di Apache License, ha reso il linguaggio di programmazione un di provenienza aperta, il che significa che può essere modificato, distribuito e utilizzato senza pagare agli sviluppatori originali.
La prima versione lanciata nel 2005 era compatibile solo con Windows e distribuita a .NET 1.Da 0 a 3.5 Runtime. La base della piattaforma stretta era la più grande debolezza di questa versione. Il problema è stato affrontato nella prossima versione che è stata sviluppata con l'aggiunta di OS X e Linux alle piattaforme supportate nella versione 2.0 che è stato lanciato nel 2010.
Nel 2012, F# ha visto l'aggiunta di JavaScript e GPU nelle piattaforme supportate. L'ultima versione è stata lanciata nel 2015 che era 4.0.
Futuro di f#
Molte persone affermano che F# è uno dei linguaggi di programmazione più impopolari, sottovalutati e sottorappresentati. Ma c'è un altro lato della storia. Secondo StackOverflow. F# è stato votato la lingua associata al salario più alto a livello globale.
Lo stesso sondaggio mostra che f# non’T appaiono nei primi 25 linguaggi di programmazione utilizzati in tutto il mondo. La lingua rimane ai margini nonostante abbia una comunità davvero attiva.
Ma perché gli sviluppatori amano lavorare con F# se lo è’s così impopolare? Creato e mantenuto da Don Syme, F# è stato relativamente resistente ad alcune delle presunte complicazioni eccessive che simili linguaggi FP hanno adottato come Scala. Questa resistenza mantiene l'accessibilità per gli sviluppatori dal mondo esterno che potrebbero essere interessati a dilettarsi nella programmazione funzionale.
F# è stato di eccellente uso quando si tratta di sviluppo basato sui dati e basati sul dominio. Ora può anche essere compilato in JavaScript che è il mondo’le lingue più popolari. Con questo link sicuro, ha anche accesso a JavaScript’s estese librerie e base di dispositivi.
F# ha lasciato il segno quando si è trattato di intelligenza artificiale, apprendimento automatico e analisi dei dati associati. Era lo scopo stesso della creazione di f#. A causa dell'immensa scala e dell'influenza attesa, l'intelligenza artificiale avrà sugli ecosistemi linguistici e la tecnologia in generale, avendo una lingua così ben adatta ai luoghi di sviluppo in una posizione forte per crescere velocemente e persino sfidare lingue popolari come JavaScript e Python in futuro.
Cosa sta fermando F#’crescita s?
Anche se sembra un fatto duro da digerire, la colpa è principalmente attribuita ai suoi creatori, che è Microsoft. Hanno limitato la popolarità di f# lasciare che c# prosperoni là fuori. Microsoft ha reso f# inferiore a c#.
C'è un movimento ciclico ad esso. Esistono pochi lavori per F# perché ci sono pochi sviluppatori F# là fuori e ci sono meno sviluppatori F# là fuori perché esistono meno lavori F# là fuori. Ma lentamente ma sicuramente, questa tendenza sta cambiando.
Jet.com è stata la prima grande azienda ad adottare l'uso di F#. Più tardi, hanno seguito anche Kaggle e molte compagnie finanziarie e assicurative.
Gli sviluppatori di F# mancano tentativi di renderlo più popolare e con le caratteristiche come un linguaggio multi-paradigma che viene utilizzato notevolmente nell'intelligenza artificiale, la cosa migliore da fare è concentrarsi sui benefici fondamentali di F# che sono tempi più brevi, meno bug e una maggiore produttività. Se promosso evidenziando queste caratteristiche, potrebbe aiutare F# salire più velocemente la scala della popolarità di prima.
F# ha davvero qualsiasi vantaggio rispetto a C#?
Già familiari con C#? Quindi impara a programmare il tuo gioco di breakout usando C#.
- F# rende più semplici le attività di programmazione comuni. Ciò comporta cose come creare e utilizzare definizioni di tipo complesso, fare elaborazione degli elenchi, macchine a stato, uguaglianza e confronto e molto altro ancora.
- Privo di punti e virgole, parentesi ricci e simili, in F# non devi quasi mai specificare il tipo di oggetto a causa della presenza di un sistema di inferenza di tipo potente. Ci vogliono anche meno linee di codici per risolvere anche questo problema
- F# è un linguaggio funzionale, ma supporta altri stili che non sono’T completamente puro, rendendo molto più facile interagire con il regno non pure di database, siti Web e così via. In particolare, F# è progettato come un linguaggio ibrido/OO funzionale, quindi è in grado di fare tutto come C#. Anche se f# si integra perfettamente con il .Ecosistema netto che consente di accedere a tutte le terze parti .Strumenti e biblioteche di rete.
- F# fa parte di Visual Studio che ti consente di ottenere un buon editor con un supporto Intellisense, un debugger e molti plugin per test unitari, controllo della fonte e altre attività di sviluppo.
F# futuro
Simile a un asincrone < >bloccare ma cattura il risultato per il consumo futuro. Questa struttura può essere molto utile per eseguire più operazioni di restituzione dei risultati in parallelo quando i risultati non sono necessari immediatamente. Ad esempio, eseguendo diverse operazioni di lettura/trasformazione o pre-populando una cache con valori calcolati ancora da. Biblioteca parallela dell'attività di Microsoft in .Net 4.0 include un'implementazione futura, quindi questa versione è necessaria solo su .Versioni nette. Commenti, suggerimenti e miglioramenti sono sempre i benvenuti.
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:
aprire Sistema aprire Sistema.Componentmodel aprire Sistema.Filo /// esegue un calcolo in un lavoratore in background e si sincronizza sul rendimento dei risultati. IL /// Il calcolo viene avviato immediatamente e si chiama blocchi "valore" fino a quando il risultato è pronto. tipo Futuro'T>(F : unità -> 'T) = /// Risultato del calcolo all'uscita normale. permettere mutevole risultato :'T opzione = Nessuno /// risultato se è stata lanciata un'eccezione. permettere mutevole ext : Eccezione opzione = Nessuno permettere syncroot = nuovo Oggetto() /// oggetto impulso usato per attendere fino a quando un risultato è pronto. assicurati che venga utilizzato in modo che noi /// non è necessario creare l'oggetto se il risultato viene eseguito prima che sia necessario. permettere mutevole impulso : ManualResevent = nullo permettere Garantire il PULSE() = serratura syncroot (divertimento () -> incontro impulso con | nullo -> impulso nuovo ManualResevent(falso); | _ -> () impulso) /// Avviso: chiama una volta che un blocco su Syncroot è già tenuto. Impulsi il notificatore di attesa. Sicuro se /// Chiamata dopo che viene creato 'Pulse' ma prima che WaitOne venga chiamato. permettere NotifyWateters() = Se impulso <> nullo Poi impulso.Impostato() |> ignorare permettere lavoro = nuovo Lavoro di sfondo() /// su Run WorkerAsync (), esegui la funzione specificata e memorizza il risultato. Tutte le eccezioni devono essere /// intrappolato. Fare lavoro.Lavora.Aggiungere( divertimento args -> Tentativo risultato Alcuni( F()) con e -> ext Alcuni e serratura syncroot ( divertimento () -> NotifyWateters())) /// Avvia immediatamente/ automaticamente. Fare lavoro.Runworkerasync() /// restituisce il valore del calcolo, bloccando se il risultato non è ancora pronto. membro T.Valore = // Se disponibile, possiamo restituirlo subito. incontro risultato con | Alcuni X
-> X | Nessuno Quando ext.Issoma -> aumentare (Opzione.Ottenere ext) | Nessuno -> permettere P = Garantire il PULSE() // controlla di nuovo nel caso in cui sia cambiato mentre stavamo ottenendo l'oggetto di attesa. incontro risultato con | Alcuni X -> X | Nessuno -> // senza blocco va bene perché se il polso.Il metodo set () è chiamato tra quando noi // controllato "risultato" e chiama Waitone qui, WaitOne tornerà immediatamente. P.Aspetta(1000000000) |> ignorare incontro risultato con | Alcuni X -> X | Nessuno -> Se ext.Issoma Poi aumentare (Opzione.Ottenere ext) altro fallimento "Il futuro calcolo fallito." /// restituisce vero se il calcolo è finito, falso se no. membro T.È completo = incontro risultato con | Alcuni X -> VERO | Nessuno Quando Opzione.Issoma ext -> VERO | Nessuno -> falso
Sistema dello spazio dei nomi
Sistema dello spazio dei nomi.Componentmodel
Sistema dello spazio dei nomi.Filo
Più articoli
tipo futuro =
nuovo: f: (unità -> 't) -> futuro
membro iscomplete: bool
Valore del membro: 't
Nome completo: script.Futuro
Esegue un calcolo in un lavoratore di fondo e si sincronizza sul rendimento dei risultati. IL
Il calcolo viene avviato immediatamente e si chiama blocchi "valore" fino a quando il risultato è pronto.
Val F: (unità -> 't)
tipo unità = unità
Nome completo: Microsoft.Fsharp.Nucleo.unità
Val Result Mutable: 'T Opzione
Risultato del calcolo all'uscita normale.
Type 'T opzione = opzione'T>
Nome completo: Microsoft.Fsharp.Nucleo.opzione
Opzione del caso dell'Unione.Nessuno: opzione
Val Mutable Ext: Opzione Eccezione
Risultato se è stata lanciata un'eccezione.
Più articoli
tipo eccezione =
Nuovo: unità -> Eccezione + 2 sovraccarico
Dati del membro: Idictionary
membro getbasexception: unità -> eccezione
membro getObjectData: Info: SerializationInfo * Contesto: StreamingContext -> Unità
membro getttype: unità -> tipo
Helplink membro: stringa con get, set
Membro InnerException: eccezione
Messaggio del membro: stringa
Fonte membro: stringa con get, set
Membro Stacktrace: String
.
Nome completo: sistema.Eccezione
--------------------
Eccezione (): unità
Eccezione (messaggio: stringa): unità
Eccezione (Messaggio: String, InneRexception: Exn): Unità
Val Syncroot: oggetto
Più articoli
tipo oggetto =
nuovo: unità -> obj
Membro è uguale: OBJ: OBJ -> BOOL
Membro GethashCode: unità -> int
membro getttype: unità -> tipo
membro toString: unità -> stringa
Membro statico è uguale: OBJA: OBJ * OBJB: OBJ -> BOOL
Referenceequals dei membri statici: OBJA: OBJ * OBJB: OBJ -> BOOL
Nome completo: sistema.Oggetto
Val Mutable Pulse: ManualResevent
Oggetto impulso usato per attendere fino a quando un risultato è pronto. assicurati che venga utilizzato in modo che noi
non è necessario creare l'oggetto se il risultato viene eseguito prima che sia necessario.
Più articoli
Digita manualReseTevent =
Ereherit EventWaitHandle
NOVITÀ: InitialState: bool -> ManualResetevent
Nome completo: sistema.Filo.ManualResevent
--------------------
ManualResetevent (inizialeState: bool): unità
VAL ASSICURATO: (Unità -> ManualResetevent)
Val Lock: LockObject: 'Lock -> Azione: (Unità ->' T) -> 'T (richiede tipo di riferimento)
Nome completo: Microsoft.Fsharp.Nucleo.Operatori.serratura
Val NotifyWateters: (unità -> unità)
ATTENZIONE: chiamare una volta che un blocco su Syncroot è già tenuto. Impulsi il notificatore di attesa. Sicuro se
Chiamato dopo che viene creato 'Pulse' ma prima che WaitOne venga chiamato.
EventWaitHandle.Set (): bool
Val Ignore: valore: 't -> unità
Nome completo: Microsoft.Fsharp.Nucleo.Operatori.ignorare
Val Work: backgroundworker
Più articoli
tipo backgroundworker =
componente ereditaria
Nuovo: unità -> Operatore di sfondo
membro cancelasync: unità -> unità
Cancellazione dei membri: bool
membro isbusy: bool
Membro reportProgress: percentualeProgress: int -> unità + 1 sovraccarico
membro run workerasync: unità -> unità + 1 sovraccarico
membro workerreportsprogress: bool with get, set
Membro WorkersupportScancellation: bool with get, set
Evento Dowork: DoworkeventHandler
Evento Progress Changed: ProgressChangeDEventHandler
.
Nome completo: sistema.Componentmodel.Lavoro di sfondo
Event Backgroundworker.Dowork: Ievent
membro iobservable.Aggiungi: callback 🙁 't -> unità) -> unità
Val Args: Doworkeventargs
Opzione del caso dell'Unione.Alcuni: valore: 't -> opzione
Val E: exn
Lavoro di sfondo.RunworkeraSync (): unità
Lavoro di sfondo.Runworkerasync (argomento: OBJ): unità
Val T: futuro
futuro membro.Valore: 't
Nome completo: script.Future`1.Valore
Su RuneworkerAsync (), esegui la funzione specificata e il risultato del memorizzazione. Tutte le eccezioni devono essere
intrappolato.
Avvia immediatamente / automaticamente.
Restituisce il valore del calcolo, bloccando se il risultato non è ancora pronto.
Opzione proprietà.Issome: bool
Val Accensione: exn: eccezione -> 't
Nome completo: Microsoft.Fsharp.Nucleo.Operatori.aumentare
Val get: opzione: 't opzione ->' t
Nome completo: Microsoft.Fsharp.Nucleo.Opzione.Ottenere
Val P: ManualResetevent
Waithandle.Waitone (): bool
Waithandle.WaitOne (timeout: Timespan): bool
Waithandle.WaitOne (millisecondstimeout: int): bool
Waithandle.WaitOne (timeout: Timespan, exitContext: bool): bool
Waithandle.WaitOne (millisecondstimeout: int, exitcontext: bool): bool
Val failwith: messaggio: stringa -> 't
Nome completo: Microsoft.Fsharp.Nucleo.Operatori.fallimento
futuro membro.Iscomplete: bool
Nome completo: script.Future`1.È completo
Restituisce vero se il calcolo è finito, falso se no.
Val Issome: Opzione: 'T Opzione -> BOOL
Nome completo: Microsoft.Fsharp.Nucleo.Opzione.Issoma
Copia Link Copia Origine della vista RAW VISUALIZZA Nuova versione
Maggiori informazioni
Collegamento: | http: // fssnip.NET/5T |
Postato: | 11 anni fa |
Autore: | Jason McCampbell |
Tag: | asincrono, parallelo, futuro, thread |
Costruzione funzionale .Applicazioni nette: una guida per la scelta tra F# vs C#
L'efficienza è tutto nel mondo dello sviluppo delle applicazioni. Gli sviluppatori e le organizzazioni che possono ottenere prodotti sul mercato più velocemente e fornire aggiornamenti più rapidi avranno sempre un vantaggio rispetto alla concorrenza.
Quindi tutti sono sempre alla ricerca di modi per ridurre i tempi di sviluppo, tempo trascorso a debug e test e tempo a spingere le uscite finite ai clienti.
La programmazione funzionale era di uso comune decenni fa, ma perse rapidamente il terreno rispetto ai linguaggi di programmazione orientati agli oggetti, che presto divennero lo standard di fatto.
Contenuti sponsorizzati correlati
Sponsor correlato
Codice, distribuisci e scala Java a modo tuo.
Microsoft Azure supporta il tuo carico di lavoro con scelte abbondanti, sia che tu stia lavorando su un'app Java, un server di app o Framework. Saperne di più.
Ma negli ultimi anni, c'è stata una rinascita di interesse per la programmazione funzionale come modo per migliorare l'efficienza dello sviluppo e costruire applicazioni più stabili e robuste.
C# e F# sono linguaggi con basi utente in crescita che si avvicinano alla programmazione funzionale in modi fondamentalmente diversi: C# in aggiunta al suo paradigma imperativo intrinseco e F# come paradigma principale.
Questo articolo indaga su quale di queste lingue svolge il miglior lavoro per gli sviluppatori che desiderano mettere in atto una programmazione funzionale per i loro team e progetti.
Il dibattito sulla programmazione funzionale vs o orientata agli oggetti
Per comprendere il dibattito, dobbiamo iniziare a un livello un po 'più alto con la differenza tra paradigmi imperativi e di programmazione dichiarativa.
- Programmazione imperativa: Un approccio di programmazione basato sul processo, in cui gli sviluppatori specificano come ottenere risultati passo-passo passo per passo. La programmazione imperativa si concentra sui cambiamenti dello stato e dello stato del programma. I linguaggi di programmazione orientati agli oggetti come Java e C ++ generalmente seguono il paradigma imperativo.
- Programmazione dichiarativa: Un approccio di programmazione orientato ai risultati, in cui gli sviluppatori specificano i tipi di risultati desiderati. La programmazione dichiarativa è agnostica dell'ordine di stato di esecuzione. Languages di programmazione funzionale come LISP, Python, Haskell e F# Segui il paradigma di programmazione dichiarativa.
Ma è una semplificazione eccessiva cercare di dividere in modo ordinato tutti i linguaggi di programmazione esistenti in queste categorie, poiché diverse lingue offrono aspetti di ciascuno. Sono lingue ibride o multi-paradigma.
Ad esempio, anche se Java e C ++ rientrano tradizionalmente nella classificazione imperativa, hanno anche aspetti funzionali. Lo stesso vale per C#. Allo stesso modo, sebbene F# sia considerato un linguaggio funzionale, ha anche capacità imperative.
Guarda l'elenco dei primi dieci lingue che gli sviluppatori usano. Vedrai che comprendono lingue per lo più ibride, con alcuni incentrati su imperativi e altri più dominalmente funzionali.
JavaScript, che ha ricoperto il primo posto in questo sondaggio per un decennio, è un linguaggio multi-paradigma, che offre sia caratteristiche imperative, orientate agli oggetti e caratteristiche funzionali.
Data la gamma di adozione, è utile considerare i diversi vantaggi che ogni paradigma presenta e i vari casi d'uso in cui ciascuno eccelle.
Programmazione imperativa: benefici e casi d'uso
Tra i principali vantaggi del paradigma imperativo c'è che il codice scritto usando lo è generalmente facilmente comprensibile e può essere facile da leggere. Inoltre, date le meticolose descrizioni del flusso di lavoro richieste dalla programmazione imperativa, anche gli sviluppatori alle prime armi trovano facile seguire.
Ma il livello di dettaglio la programmazione imperativa richiede anche con lati negativi. Ad esempio, in applicazioni più complesse, il codice può rapidamente diventare gonfio. All'aumentare della dimensione del codice, la facilità di lettura e comprensione cade altrettanto rapidamente.
Inoltre, man mano che il codice si espande, aumenta il potenziale per bug ed errori. Pertanto, gli sviluppatori che lavorano con lingue imperative spesso si ritrovano a dedicare molto tempo a debug e test, ritardando le versioni dei prodotti.
Tuttavia, la programmazione imperativa rimane incredibilmente popolare e ha una vasta gamma di casi d'uso. Le applicazioni tradizionali per la programmazione imperativa includono:
- Ipertesto e ipermediale
- Sistemi di gestione del database degli oggetti (ODBMS)
- Sistemi client-server
- Sistemi in tempo reale
- Intelligenza artificiale, apprendimento automatico e reti neurali
- Automazione
Programmazione funzionale: benefici e casi d'uso
I vantaggi della programmazione funzionale terreno più sul lato dell'efficienza dell'equazione. Il codice funzionale, sebbene meno facile da leggere e comprendente a prima vista, tende ad essere più vicino a quelli senza bug (i.e., Nessun effetto collaterale per i cambiamenti statali), riducendo il tempo degli sviluppatori trascorsi nel debug e nei test.
Meno bug si presta anche a applicazioni più sicure, limitando la superficie di attacco per i criminali informatici per ridurre le probabilità di attacchi ransomware, malware o iniezioni di SQL.
La programmazione funzionale è anche migliore sia nell'elaborazione parallela che nella valutazione pigra. Inoltre, il codice funzionale è più modulare e riutilizzabile, riducendo la necessità di un codice ridondante. Il set di codice più piccolo è più facile da mantenere e può essere più elevato. Tuttavia, il codice funzionale può essere intensivo di memoria, eliminando qualsiasi velocità di velocità dalla riduzione delle dimensioni del codice e portando effettivamente a una riduzione delle prestazioni complessive.
La programmazione funzionale è particolarmente popolare tra accademici e data scientist, perché è efficace nel gestire la manipolazione di set di dati di grandi dimensioni.
Data la sua attenzione all'elaborazione parallela e all'immutabilità, la programmazione funzionale è particolarmente utile per:
- Scienza dei dati
- Applicazioni fogli di calcolo
- Applicazioni finanziarie e rischi
- Elaborazione in lotti
Programmazione funzionale: C# vs F#
C# e F# sono lingue che hanno guadagnato popolarità negli ultimi anni. Sebbene siano entrambi multi-paradigmi, il loro obiettivo principale differisce, con C# che si basa su principi imperativi orientati agli oggetti e F# che si basano su principi funzionali. Ma uno supera l'altro quando si tratta di una programmazione funzionale?
Cosa è C#e chi lo sta usando?
C# è un linguaggio multi-paradigma, orientato agli oggetti per la prima volta da Microsoft circa 20 anni fa. Come puoi vedere dalle statistiche di utilizzo sopra, era l'ottavo linguaggio più popolare tra gli sviluppatori nel 2022, con quasi un terzo degli sviluppatori che lo usavano. Ha anche punteggi elevati di soddisfazione, con due terzi degli utenti C# che dicono di amarlo.
C# sta trovando molti usi nello sviluppo di servizi web e cloud, nonché lo sviluppo del gioco. Le aziende da Microsoft a TrustPilot a StackOverflow stanno creando applicazioni e servizi con C#.
Programmazione funzionale in C#
Sebbene C# sia principalmente orientato agli oggetti e mutabile/stato, ha capacità funzionali. Ecco alcuni modi per implementare il paradigma funzionale in C#.
Creare immutabilità
Poiché i tipi di dati in C# sono intrinsecamente mutabili, quando si desidera utilizzare i principi di programmazione funzionale, è necessario creare l'immutabilità. E questo è più complicato del semplice fare affidamento su tipi di dati immutabili in F#. In particolare, per creare tipi immutabili in C#, è necessario rendere il tipo di sola lettura, rimuovere le proprietà del setter, utilizzare un costruttore per fornire i parametri e quindi creare una nuova istanza ogni volta.
Usa le espressioni Linq e Lambda
Microsoft ha creato il framework LINQ (Language Integrated Query) specificamente per introdurre funzionalità di programmazione funzionale in C#. LINQ fornisce funzioni per l'operazione su elenchi o sequenze, tra cui la mappatura (selezione), l'ordinamento (ordine) e il filtro (dove). Ognuna di queste espressioni ha funzioni per gli argomenti. Le espressioni creano nuove istanze della sequenza piuttosto che mutare la sequenza esistente. LINQ è particolarmente utile per l'interrogazione di set di dati, sia tabelle SQL, dati XML o altre fonti.
Linq consente anche l'uso di espressioni lambda, che sono funzioni essenzialmente anonime. Le funzioni anonime sono un aspetto chiave della programmazione funzionale. Le espressioni Lambda possono fungere da argomenti per altre funzioni nel codice, creando funzioni di ordine superiore, un'altra caratteristica comune della programmazione funzionale.
Usa le catene del metodo
Una caratteristica comunemente usata di F# è l'operatore della pipeline, che passa il risultato di una funzione a un'altra funzione. Il pipelining non è integrato in C, ma gli sviluppatori possono imitare le condutture in determinate situazioni utilizzando catene di metodi o interfacce fluenti. Questo può essere effettuato utilizzando la funzionalità StringBuilder in C#.
Le catene del metodo consentono anche di replicare un'altra caratteristica comune di programmazione funzionale, curry. Il currying consente a una funzione con più argomenti di ricevere tali argomenti in momenti diversi. In sostanza, nella programmazione funzionale, se una funzione non riceve tutti gli input necessari, restituisce una nuova funzione con gli input mancanti come argomenti.
In C#, implementate curry con catene di metodi per decomporre un argomento multifunzione in una sequenza nidificata di diverse funzioni di argomento singolo. Tuttavia, questo non è così pulito o efficiente come in F#.
Questi sono solo alcuni dei modi in cui gli sviluppatori C# qualificati possono applicare i principi di programmazione funzionale in C#. E mentre possono richiedere più sforzi rispetto al semplice utilizzo di F#, per quegli sviluppatori che desiderano offrire tutte le altre funzionalità C#, sono un'alternativa praticabile.
Cos'è F#e chi lo sta usando?
Inizialmente rilasciato da Microsoft per la piattaforma Windows nel 2005, F# è un linguaggio di programmazione prevalentemente funzionale. Si è ampliato per comprendere piattaforme Linux e MacOS nel 2010 e quindi JavaScript nel 2013. Inoltre, nel 2013, la Fondazione software F# è stata lanciata per supportare Microsoft nel suo sviluppo e sia F# che F# Community.
Fin dalla sua istituzione, la comunità F# è cresciuta costantemente, anche se lentamente. Ora include un gruppo GitHub e molti diversi progetti comunitari, dai transpilers JavaScript (Fable) ai pacchetti dei gestori (Paket) alle biblioteche di sviluppo del web (SUAVE) e altro ancora.
Nonostante la sua età, F# ha ancora un sostanziale spazio per l'adozione. Le statistiche sull'uso generale sono un po 'difficili da trovare, ma un sondaggio del 2021 di jetbrain di oltre 30000 sviluppatori ha indicato che solo l'1% aveva recentemente utilizzato F# o stava pianificando di farlo nel prossimo futuro. In confronto, il 21% aveva recentemente utilizzato C#e il 4% ha programmato di usarlo presto. E F# ha una valutazione di soddisfazione leggermente più bassa di C#, anche se oltre il 60% degli sviluppatori afferma di amarlo.
Attualmente, ci sono meno di 100 aziende che sono note per utilizzare F# in produzione, sebbene includano alcuni nomi noti come Walmart e Huddle.
Alcuni sviluppatori stanno usando F# come complemento a C#, piuttosto che fare affidamento sulle capacità funzionali che esistono nativamente in C#. Perché entrambi si compilano a .Lingue intermedie nette (IL), è possibile utilizzare entrambi nello stesso progetto.
Quale linguaggio ha il vantaggio per la programmazione funzionale?
Sembra che questa dovrebbe essere una domanda molto semplice a cui rispondere: F# è prima funzionale, mentre C# è per primo imperativo, quindi il bordo va a F#. E ai massimi livelli, questa affermazione è vera. Ma lo sviluppo dell'applicazione, come la vita, è raramente abbastanza semplice per l'applicazione generalizzata di verità di alto livello.
La domanda migliore da porre è quale lingua è giusta per te, il tuo team e i progetti su cui stai lavorando al momento. E questa è una domanda molto più complessa a cui rispondere.
Scegliere il linguaggio giusto per la programmazione funzionale
Quando si seleziona tra C# e F# per le tue esigenze di programmazione funzionale, ci sono diverse considerazioni che dovrebbero considerare la tua decisione:
- Quali sono le esigenze del progetto? I set di funzionalità specifici della tua applicazione potrebbero farti molta strada nel processo decisionale. Ad esempio, se le caratteristiche più importanti dell'applicazione ruotano attorno agli elementi dell'interfaccia utente, con solo minori manipolazioni di dati, potresti voler concentrarti su C#. Ma se l'applicazione è ad alta intensità di dati e gli elementi dell'interfaccia utente sono meno importanti, probabilmente ti appoggerai a F#.
- Qual è il tuo livello di comfort con ogni lingua? Se la tua applicazione trarrà beneficio dalla programmazione funzionale, ma tu non’T sperimentato abbastanza con C# per gestire facilmente le manipolazioni necessarie per creare tipi immutabili e tradurre da dichiarazioni alle espressioni, allora dovresti considerare F#.
- In che modo il tuo team affronterà lingue diverse? Quando si lavora con un team di sviluppo, è necessario considerare i set di abilità e l'esperienza di ciascun membro del team. Potresti avere uno sviluppatore F# molto qualificato, ma altri con poca o nessuna esposizione a F#. Ciò può portare a difficoltà per i membri del team nel lavorare con il codice scritto da altri sviluppatori.
- È un approccio multi-linguaggio migliore? Il tuo team di sviluppo è sufficientemente qualificato per far lavorare insieme a C# e F# sullo stesso progetto? Ci sono ragioni per cui una di queste lingue da sola non lo fa’T affrontare sufficientemente tutte le esigenze della tua applicazione? Ma pensa attentamente prima di adottare questo approccio: dovresti farlo solo se è più efficiente ed efficace rispetto all'utilizzo di entrambe le lingue separatamente.
Conclusione
Quando un progetto di sviluppo richiede una programmazione funzionale, ci sono molte opzioni disponibili per il team di sviluppo, dai linguaggi puramente funzionali ai linguaggi multi-paradigmi come C# e F#. Fare la scelta migliore tra le buone opzioni concorrenti non è sempre semplice, ma il tempo investito nel prendere quella decisione sarà premiato con una migliore efficienza dello sviluppo e prodotti migliori.