2010-11-06 9 views
10

¿Alguien me puede indicar ejemplos de programación multiparadigm (objeto-funcional) en F #?¿Puede alguien señalarme ejemplos de programación multiparadigm (objeto-funcional) en F #?

Estoy buscando específicamente ejemplos que combinen la programación funcional OO &. Se ha hablado mucho sobre cómo F # es un lenguaje híbrido, pero no he podido encontrar ejemplos que demuestren el ejemplo de la programación multiparadigma.

Gracias

+0

¿No es el hecho de que F # puede * consumir * y * producir * tipos de clase que otros lenguajes MSIL pueden usar (por ejemplo, C#, VB.NET y J #) para argumentar sobre el aspecto de "objeto"? ¿O hay una investigación más específica al acecho? –

+0

¿Qué es lo que realmente quieres? Suena como si estuvieras pidiendo un ejemplo de 10,000 líneas del mundo real (tal vez respaldado por un libro blanco de un estudio de caso); si no, ¿puedes aclarar lo que quieres ver? – Brian

+1

Hola, solo quería ver las ventajas de la programación funcional de objetos sobre solo OO o solo la programación funcional. He estado usando F # y C# ambos en un proyecto pero F # principalmente para escribir métodos de biblioteca consumidos por C#. Estamos buscando ejemplos de cómo la programación híbrida puede ayudarnos. A partir de ahora, solo utilizamos la coincidencia de patrones y la comprensión de listas (solo dentro de los métodos). Claramente debería haber algo más que nos falta :) –

Respuesta

6

Hay dos formas de combinar el paradigma funcional y el orientado a objetos. Hasta cierto punto, son independientes y puede escribir código inmutable (funcional) que está estructurado usando tipos (escritos como objetos F #). Un F # ejemplo de Client tipo escrito como este sería:

// Functional 'Client' class 
type Client(name, income) = 
    // Memebers are immutable 
    member x.Name = name 
    member x.Income = income 

    // Returns a new instance 
    member x.WithIncome(ninc) = 
    new Client(name, ninc) 
    member x.Report() = 
    printfn "%s %d" name income 

Tenga en cuenta que la WithIncome método (que "los cambios" los ingresos del cliente) en realidad no hacer ninguna modificación - que sigue el estilo funcional y crea un nuevo cliente actualizado y lo devuelve como resultado.

Por otro lado, en F # también puede escribir código orientado a objetos que tiene propiedades públicas mutables, pero utiliza una estructura de datos inmutables bajo la cubierta. Esto puede ser útil cuando se tiene algo de código funcional agradable y desea exponer a los programadores C# de forma tradicional (imperativo/orientado a objetos):

type ClientList() = 
    // The list itself is immutable, but the private 
    // field of the ClientList type can change 
    let mutable clients = [] 
    // Imperative object-oriented method 
    member x.Add(name, income) = 
    clients <- (new Client(name, income))::clients 
    // Purely functional - filtering of clients 
    member x.Filter f = 
    clients |> List.filter f 

(El ejemplo se toma a partir del código fuente de Chapter 9 de mi libro. Hay más ejemplos de códigos inmutables orientados a objetos, por ejemplo, en simulación paralela en el Capítulo 14).

+0

Gracias. No he podido encontrar ninguna motivación para escribir código objeto funcional. En su mayoría he estado haciendo objetos inmutables como lo has mencionado. Sin embargo, ¿hay algún caso en el que el estado del objeto mutable y una jerarquía de objetos con datos variables ayude en un lenguaje como F #? Estoy buscando específicamente ejemplos donde la programación funcional de objetos sea mejor que funcional y OO de forma independiente. –

+2

He leído tu libro y también un par de libros de F #. La mayoría de los ejemplos son funcionales uo pero no muestran ninguna ventaja real de mezclar OO y programación funcional. –

3

que no conocen nada F #, pero puedo mostrar un ejemplo de la mecánica de idiomas exactos que está buscando en Scala. Ignora si esto no es útil.

class Summation { 

    def sum(aLow : Int, aHigh : Int) = { 
     (aLow to aHigh).foldLeft(0) { (result, number) => result + number } 
    } 

} 

object Sample { 

    def main(args : Array[String]) { 
     println(new Summation sum(1, 10)) 
    } 

} 

He intentado mantenerlo súper simple. Tenga en cuenta que estamos declarando que una clase suma un rango, pero la implementación se usa con un estilo funcional. De esta manera, podemos abstraer el paradigma que utilizamos para implementar una pieza de código.

+0

No sé si eso es realmente un ejemplo, sin embargo. Claro, estás usando 'objeto', pero no estás usando nada de su poder. Solo como una forma de mantener un método, que nunca se llama excepto por el tiempo de ejecución. –

+0

Gracias por el ejemplo Mike. Pero no hay OO involucrado aquí. ¿Sería posible que me señalara algo que ofrezca las ventajas tanto de OO como de la programación funcional y tenga ventajas en comparación con estos enfoques de manera independiente? –

+0

Sí, quizás un poco demasiado simple. Me ajusté un poco. Si esto aún no es suficiente, házmelo saber. También podría ayudar a mencionar que no soy muy bueno en Scala. – Mike

9

Hice un pequeño (600 líneas) clon de Tetris con F # que está orientado a objetos usando XNA. El código es antiguo (usa #light) y no es el código más bonito que jamás hayas visto, pero desafiante es una mezcla de OOP y funcional. Consiste de diez clases. No creo que pase ninguna función de primera clase, pero es un buen ejemplo de la potencia funcional de F # en programming the small.

  • MyGame - Hereda la principal clase de juegos XNA y es el punto de entrada del programa.
  • Board - Realiza un seguimiento de las piezas que ya no se mueven y la línea horizontal se completa.
  • UI - La interfaz de usuario sólo tiene dos estados (de juego y el menú principal) manejado por bool stateMenu
  • Tetris - Maneja el estado del juego. Juego por encima y colisión de piezas.
  • Piece - Define las diferentes formas de Tetris y su movimiento y dibujo.
  • Player - Maneja la entrada del usuario.
  • Shape - El objeto gráfico base que se asigna a primative.
  • Primative - Ajusta el tipo de primitivo vértice.

Hice un diagrama de clase aproximado para ayudar. Si tiene alguna pregunta, no dude en preguntar en la sección de comentarios.

alt text

+0

Muy buena respuesta, no tenía idea de que XNA y F # tendrían unas funcionalidades tan increíbles juntas, ni siquiera sabía que era compatible para eso (Deje de reír: P) – Proclyon

2

No sé sobre F #, pero la mayoría de los softwares escritos en Scala son de naturaleza funcional objeto.

El compilador de Scala es probablemente el más grande y el más moderno de un software funcional. Otros ejemplos notables incluyen Akka, Lift, SBT, etc. Kestrel (googlear le encontrará muchos más ejemplos Scala-funcional de objetos.)

4

El más potente experiencia que he tenido mezclar OO (específicamente la mutación) y la programación funcional es logrando ganancias de rendimiento al usar estructuras de datos mutables internamente mientras disfruta de todos los beneficios de la inmutabilidad de los usuarios externos. Un gran ejemplo es una implementación que escribí de un algoritmo que produce permutaciones lexicográficas que puedes encontrar here. El algoritmo que uso es imperativo en su núcleo (pasos de mutación repetidos de una matriz) que sufriría si se implementara con una estructura de datos funcional. Al tomar una matriz de entrada, hacer una copia de solo lectura inicialmente para que la entrada no se corrompa y luego producir copias de solo lectura en la expresión de secuencia después de realizar los pasos de mutación del algoritmo, alcanzamos un equilibrio fino entre OO y técnicas funcionales. La respuesta vinculada hace referencia a la implementación original de C++, así como a los puntos de referencia de otras respuestas de implementación puramente funcionales. El rendimiento de mi implementación OO/funcional mixta se encuentra entre el rendimiento superior de la solución OO C++ y la solución F # funcional pura.

Esta estrategia de usar OO/estado mutable internamente mientras se mantiene puramente externa a la persona que llama se utiliza en toda la biblioteca F #, especialmente con el uso directo de IEnumerators en el módulo Seq.

Se puede encontrar otro ejemplo comparando la memorización utilizando una implementación mutable del diccionario frente a una implementación inmutable del mapa, que Don Syme explora here. La implementación inmutable del diccionario es más rápida pero no menos pura en el uso que la implementación del mapa.

En conclusión, creo que usar OO mutable en F # es más poderoso para los diseñadores de bibliotecas que buscan mejoras en el rendimiento y al mismo tiempo mantener todo funcional para los consumidores de la biblioteca.

Cuestiones relacionadas