2010-10-06 20 views
15

¿Es posible forzar que F # se comporte como un lenguaje funcional puro como Haskell? ¿Tal vez usando algunas directivas de compilación?Funcionalidad pura con F #

PD: ya que vengo de un fondo de C/C++, quiero obligarme a aprender la programación funcional sin tener que aprender Haskell :)

+7

¿Por qué no aprender Haskell? Su sintaxis es casi un subconjunto de F # 's, y con el conocimiento en Haskell F # será un pedazo de la torta. Posible efecto secundario: odiarás F #. – luqui

Respuesta

11

No puede forzar este comportamiento en F #, pero como dijo Brian, la disciplina es su mejor amigo. P.ej. no utilice mutable, for o while bucles, ref palabras clave, etc. También adhiérase a estructuras de datos puramente inmutables (unión discriminada, lista, tupla, mapa, etc.). Si necesita hacer IO en algún momento, diseñe su programa para que estén separados de su código puramente funcional.

No olvide que la programación funcional se trata de limitar y aislar los efectos secundarios.

+4

"No se olvide que la programación funcional se trata de limitar y aislar los efectos secundarios". - o representándolos, para que ya no estén en el "lado" :) – mokus

+1

"No olvides que la programación funcional se trata de limitar y aislar los efectos secundarios" - Para mí, al menos, también se trata de poder definir tipos correctamente de modo que los estados inválidos se vuelvan irrepresentables. Puede hacerlo en otros idiomas (como C++) pero el sistema de tipos de F # y otros lenguajes funcionales lo hace más fácil. – sashang

10

No, lo siento. Solo tienes que usar la disciplina.

+0

¿Puedes incluso hacerlo?Tendría que crear mónadas para todo lo que normalmente haría con efectos secundarios (como E/S). – Gabe

+1

@Gabe: hay otros modelos para IO además del sistema de mónada de Haskell, aunque es la mejor solución de compromiso entre flexibilidad y simplicidad (sorprendentemente) de la que he oído hablar. Puede que le interese leer el artículo de "Simon Squad" de Simon Peyton Jones si quiere leer un razonamiento muy profundo sobre el tema. – Chuck

+0

Chuck: ¿Está diciendo que F # tiene una primitiva de E/S puramente funcional que no es una mónada? O que lo que sea que implementes para hacer I/O no tendría que ser una mónada? – Gabe

0

No. Actualmente, el compilador de F # no puede hacer esta comprobación.

¿Por qué no comenzar a escribir algunos programas F # para aprender la programación funcional? Conozco a algunas personas que primero aprendieron ML/Ocaml/F # y luego se mudaron a Haskell.

A continuación, tendrá una mejor comprensión de la pureza. (Si realmente no has tocado ningún lenguaje de programación funcional antes, tu comprensión de funcional puro podría ser superficial.)

4

Si eres como yo, probablemente evitarás las 'cosas buenas' si no lo haces oblígate a usar Haskell en lugar de F # y usa Haskell tan idiomáticamente como puedas. Usar tipos de datos algebraicos en lugar de objetos, aprender a amar la pereza, abrazar la mónada y más, son mucho más parte central de Haskell, y podría decirse que son algunos de los puntos más delicados (en mi opinión) de la programación funcional pura.

F # no tiene una curva de aprendizaje tan empinada en muchos sentidos, pero parece que lo aprende por diversión, entonces ¿por qué no desafiarse de todos modos? Puedo dar fe de que pasar a F # después de usar Haskell puede darle una mejor idea de cómo F # en general debe usarse para ser utilizado de todos modos.

Alimento para el pensamiento.

2

Los aspectos puramente funcionales de Haskell son fundamentales para el lenguaje. No puedes simplemente trasplantarlo entre idiomas. Lleva a importantes decisiones de diseño; por ejemplo, la naturaleza puramente funcional de Haskell condujo a la invención de la mónada IO. F # no tiene una "válvula de escape" para el cálculo con estado.

Además, aprender a programar en un lenguaje que admita programación funcional pero no lo haga cumplir estrictamente podría ser realmente instructivo. Muchas personas se confunden entre las decisiones de diseño individuales de Haskell (por ejemplo, la mónada IO, para golpear nuevamente al gran ejemplo) y cómo funciona la programación funcional en general.

En resumen: No, usted no puede esto. Pero lo que puede hacer es observar con mucho cuidado y cuestionar todo lo que haga que implique mantener las operaciones de estado y secuenciación para asegurarse de que no hay una abstracción más pura de la que se está perdiendo.