2009-04-28 5 views
7

Admito que todavía no he compartido F #. Pero en las descripciones de 30,000 pies, siguen hablando de código fácil de probar que no tiene un estado mutable. ¿Es eso lo mismo que los métodos estáticos?¿Puedo obtener los mismos beneficios de la programación funcional (F #) usando más métodos estáticos en C#?

¿Podría obtener el beneficio de F # al escribir parte de mi código en clases con todos los métodos estáticos?

Estoy buscando la respuesta corta, sé que existen libros enteros sobre el tema.

Respuesta

8

Sin duda podría escribir el código C# inmutablemente, pero eso no tiene nada que ver con las funciones estáticas. La inmutabilidad son cosas como tener una estructura u objeto que solo "cambia de estado" haciendo una copia de sí mismo y haciendo que la copia sea diferente.

3

No, no es lo mismo que los métodos estáticos. No tiene estado mutable si no asigna nada (locales, argumentos de función, campos estáticos, campos de instancia) después de que se inicializó. Puede obtener algunos de los beneficios al diseñar sus clases para que sean inmutables.

8

Absolutamente no, la inmutabilidad no tiene nada que ver con que los métodos sean estáticos o de instancia. String, al ser una clase inmutable, tiene muchos métodos de instancia que, de manera muy funcional, devuelven una nueva instancia de la clase String, en lugar de modificar nada.

Puede intentar emular F # utilizando la descomposición funcional, pero esto seguirá siendo un código bastante imperativo.

+0

Hmm, eso lleva a otra pregunta, que ahora preguntaré en S.O. también-- ¿qué es la descomposición funcional? – MatthewMartin

+0

Todo es muy simple: http://en.wikipedia.org/wiki/Decomposition_(computer_science) –

+0

Eso solo dice que usar funciones hechas de funciones (etc.) es un buen diseño. ¿Es eso una característica de la programación funcional o simplemente tienen ambos función en el nombre? – MatthewMartin

2

No, los dos conceptos no están relacionados. Los métodos estáticos en C# aún pueden modificar objetos entrantes como normales y otras variables usando ref o out.

5

Además de los módulos estáticos y funcionales en comparación con los objetos, puede intentar obtener algunos de los beneficios de F # utilizando C# 3 y lambdas, LINQ, etc. Sin embargo, eso no va muy lejos. Lo que me parece agradable en Fa # es:

  • Inferencia todas partes
  • Auto-generalización (añade en parámetros de tipo así que no tengo que ordenar a cabo de forma manual)
  • Fácil inmutabilidad
  • Fácil mezcla entre módulos y clases de
  • Tipos como los sindicatos discriminados
  • coincidencia de patrones
  • funciones anidadas (ligeros)
  • funciones de primera clase (no, C# 's nombrados delegados no cuentan)
  • Todo es una expresión
  • Fácil composición de la función

Por lo tanto, se puede tratar de hacer algo de esto en C#. Algunos de ellos simplemente no son compatibles y no funcionarán. El resto se pone muy feo, muy rápido.

Por lo tanto, si te alejas mucho de las extensiones LINQ y Enumerable, probablemente termines en un mundo de dolor.

4

Disiento a diferir con todas las otras respuestas hasta la fecha. La inmutabilidad y los métodos estáticos pueden no estar estrictamente relacionados técnicamente, pero he descubierto que usar F # me ha animado a hacer que los métodos de C# estén estáticos cada vez que puedo.

El pensamiento es análogo, en el sentido de que es más fácil manejar un objeto inmutable porque no tiene que preocuparse de que cambie el estado. De la misma manera, no tiene que preocuparse por el estado cuando usa un método estático (a menos que use un singleton global o algo así ...).

+0

No tengo claro por qué querría que la estática representara la inmutabilidad. Por ejemplo, ¿por qué querrías: x = String.gsub (y, 'a', 'b') en lugar de x = y.gsub ('a', 'b'). Parece que con más frecuencia todavía tendría un actor, por lo que querría una función normal. Las funciones estáticas son usualmente cuando no hay un actor claro, como String.cmp (x, y) que parece no ser peor que x.cmp (y). Por supuesto, existen situaciones de excepción como usted menciona. –

+1

Toda la pregunta es: "¿Puedo confiar en que este método hará lo que espero?". Si su método es * verdaderamente * funcional, su resultado será únicamente una función de los argumentos, y no de otro estado 'externo' al que haga referencia. En ese caso, puede realizar pruebas basadas únicamente en argumentos y considerar que su método es confiable. En este sentido, incluso dentro de una clase no estática, si puedo razonablemente hacer un método estático, lo haré. – Benjol

1

Es cierto. No obtendrá los beneficios de la programación funcional simplemente al usar más funciones estáticas en C#. Sin embargo, si miraras debajo del capó (usando Reflector, por ejemplo) entiendo que una declaración simple de let es una función estática. En otras palabras,

//F# 
let a = 2 

es como una función en C#

//C# 
static int a() 
{ 
    return 2; 
} 

Puedo comprender la confusión.

Explicación extraída de "F # Eye for the C# Guy presentation" de Leon Bambrick.

Cuestiones relacionadas