Attualmente sto imparando F # e la programmazione funzionale in generale (da uno sfondo C#) e ho una domanda sull'utilizzo degli oggetti .net CLR durante la mia elaborazione.Come si passano i valori degli oggetti .net attorno a F #?
Il modo migliore per descrivere il mio problema sarà quello di dare un esempio:
let xml = new XmlDocument()
|> fun doc -> doc.Load("report.xml"); doc
let xsl = new XslCompiledTransform()
|> fun doc -> doc.Load("report.xsl"); doc
let transformedXml =
new MemoryStream()
|> fun mem -> xsl.Transform(xml.CreateNavigator(), null, mem); mem
Questo codice trasforma un documento XML con un documento XSLT utilizzando oggetti .NET. Nota XslCompiledTransform.Load funziona su un oggetto e restituisce void. Anche XslCompiledTransform.Transform richiede un oggetto memorystream e restituisce void.
La strategia di cui sopra è quella di aggiungere l'oggetto alla fine (il; mem) per restituire un valore e far funzionare la programmazione funzionale.
Quando vogliamo fare questo uno dopo l'altro abbiamo una funzione su ogni riga con un valore di ritorno alla fine:
let myFunc =
new XmlDocument("doc")
|> fun a -> a.Load("report.xml"); a
|> fun a -> a.AppendChild(new XmlElement("Happy")); a
Esiste un modo più corretto (in termini di programmazione funzionale) per gestire .net oggetti e oggetti che sono stati creati in un altro ambiente OO?
Il modo in cui ho restituito il valore alla fine ha avuto inline le funzioni ovunque sembra un trucco e non il modo corretto per farlo.
Qualsiasi aiuto è molto apprezzato!
Grazie per l'ottima risposta :) Posso inserire il codice (ad esempio il secondo esempio che hai scritto) tutto in una singola funzione che restituisce l'oggetto doc? – Russell
Sì, sicuramente! Questo è il modo migliore per nascondere i (brutti) imperativi bit dal resto del (simpatico) programma funzionale. Ho modificato la risposta (il primo esempio), in modo che mostri una semplice funzione per trasformare i file XML usando i file XSL. –
Eccellente grazie per gli esempi dettagliati e le spiegazioni! :) – Russell