Actualmente estoy aprendiendo F # y programación funcional en general (desde un fondo de C#) y tengo una pregunta sobre el uso de objetos .NET CLR durante mi procesamiento.¿Cómo se pasan los valores de los objetos .net en F #?
La mejor manera de describir mi problema será dar un ejemplo:
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
Este código se transforma un documento XML con un documento XSLT utilizando objetos .NET. Nota XslCompiledTransform.Load funciona en un objeto y devuelve vacío. También XslCompiledTransform.Transform requiere un objeto de tren de memoria y devuelve vacío.
La estrategia anterior utilizada es agregar el objeto al final (el; mem) para devolver un valor y hacer que la programación funcional funcione.
Cuando queremos hacer esto, uno tras otro tenemos una función en cada línea con un valor de retorno al final:
let myFunc =
new XmlDocument("doc")
|> fun a -> a.Load("report.xml"); a
|> fun a -> a.AppendChild(new XmlElement("Happy")); a
¿Hay una manera más correcta (en términos de programación funcional) para manejar .net objetos y objetos que se crearon en un entorno más OO?
La forma en que devolvió el valor al final y luego tuve funciones en línea en todas partes se siente como un hack y no es la forma correcta de hacerlo.
¡Cualquier ayuda es muy apreciada!
Gracias por la gran respuesta :) ¿Puedo poner el código (digamos el segundo ejemplo que escribió) todo en una sola función que devuelve el objeto doc? – Russell
Sí, definitivamente! Esa es la mejor manera de ocultar los bits imperativos (feos) del resto del (agradable) programa funcional. Edité la respuesta (el primer ejemplo), de modo que muestra una función simple para transformar archivos XML utilizando archivos XSL. –
¡Excelente gracias por los ejemplos detallados y explicaciones! :) – Russell